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