Перейдите к операторам сравнения шаблонов с отсутствующим ключом карты

Я не могу найти документацию о том, какой тип возвращаемого значения является при попытке ключа на карте, в которой ключ не существует. Из трекера 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.