Перейдите к операторам сравнения шаблонов с отсутствующим ключом карты
Я не могу найти документацию о том, какой тип возвращаемого значения является при попытке ключа на карте, в которой ключ не существует. Из трекера Go goug он выглядит как "нет значения"
Я пытаюсь сравнить два значения с помощью функции 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 не является пустой строкой ""
, как и в самом Go.
Есть ли простой способ сравнить потенциально несуществующее значение карты и другое значение?
Ответы
Ответ 1
Используйте функцию индекса:
{{if eq (index .MyMap "KeyThatDoesntExist") "mystring"}}
{{.}}
{{end}}
playground example
Функция index
возвращает нулевое значение для типа значения карты, когда ключ отсутствует на карте. Нулевое значение для карты в вопросе - пустая строка.
Ответ 2
Вы можете сначала проверить, находится ли ключ на карте, и выполнять только сравнение, если оно есть. Вы можете проверить с помощью другого действия {{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.