在尝试键入不存在键的映射时,我无法找到有关返回值类型的任何文档。从Go bug跟踪器看来,这似乎是一个特殊的“无价值”
我尝试使用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字段中的空字符串""
。
是否有一种简单的方法来比较可能不存在的地图值和另一个值?
答案 0 :(得分:17)
使用索引功能:
{{if eq (index .MyMap "KeyThatDoesntExist") "mystring"}}
{{.}}
{{end}
当键不在地图中时,index函数返回地图值类型的零值。问题中地图的零值是空字符串。
答案 1 :(得分:1)
您可以先检查密钥是否在地图中,如果是,则只执行比较。您可以查看其他{{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上尝试这些。