Операторы сравнения шаблонов 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.