19

在尝试将键插入不存在键的映射时,我无法找到有关返回值类型的任何文档。从 Go 错误跟踪器来看,它似乎是一个特殊的“无价值”

我正在尝试使用该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 本身的空字符串。

有没有一种简单的方法来比较可能不存在的地图值和另一个值?

4

2 回答 2

26

使用索引函数:

{{if eq (index .MyMap "KeyThatDoesntExist") "mystring"}}
  {{.}}
{{end}}

playground example

index当键不在映射中时,该函数返回映射值类型的零值。问题中地图的零值是空字符串。

于 2016-01-21T07:34:31.760 回答
2

您可以先检查 key 是否在 map 中,如果是则只进行比较。您可以使用其他{{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 存在但关联的 value 是"",那也将导致"Key not found".

在Go Playground上试试这些。

于 2016-01-21T07:32:02.717 回答