Операторы сравнения шаблонов Go на отсутствующем ключе карты
Я не могу найти любую документацию о том, что тип возвращаемого значения при попытке ключ в карту, в которой ключ не существует. Из Go bug tracker он кажется специальным "нет значения"
Я пытаюсь сравнить два значения с помощью eq функция, но она дает ошибку, если ключ не существует
пример:
var themap := map[string]string{}
var MyStruct := struct{MyMap map[string]string}{themap}
{{if eq .MyMap.KeyThatDoesntExist "mystring"}}
{{.}}
{{end}
результаты error calling eq: invalid type for comparison
из этого я предполагаю, что значение nil не является пустой строкой "" как это в себе.
есть ли простой способ сравнить потенциально несуществующее значение карты и другое значение?
2 ответов
используйте функцию индекса:
{{if eq (index .MyMap "KeyThatDoesntExist") "mystring"}}
{{.}}
{{end}
функция index возвращает нулевое значение для типа значения карты, когда ключ отсутствует на карте. Нулевое значение для карты в вопросе-это пустая строка.
вы можете сначала проверить, находится ли ключ на карте, и только выполнить сравнение, если это так. Вы можете проверить с другим {{if}} действия или {{with}} действие, которое также устанавливает трубопровода.
используя {{with}}:
{{with .MyMap.KeyThatDoesntExist}}{{if eq . "mystring"}}Match{{end}}{{end}}
через другой {{if}}:
{{if .MyMap.KeyThatDoesntExist}}
{{if eq .MyMap.KeyThatDoesntExist "mystring"}}Match{{end}}{{end}}
обратите внимание, что вы можете добавить {{else}} ветви для покрытия других случаев. Полное покрытие с {{with}}:
{{with .MyMap.KeyThatDoesntExist}}
{{if eq . "mystring"}}
Match
{{else}}
No match
{{end}}
{{else}}
Key not found
{{end}}
полный охват с {{if}}:
{{if .MyMap.KeyThatDoesntExist}}
{{if eq .MyMap.KeyThatDoesntExist "mystring"}}
Match
{{else}}
No match
{{end}}
{{else}}
Key not found
{{end}}
обратите внимание, что во всех вариантах полного покрытия, если ключ существует, но связанное значение "", что также приведет к "Key not found".
попробуйте это на Go Playground.