在缺少的地图键上去模板比较运算符

时间:2016-01-21 06:49:13

标签: go go-templates

在尝试键入不存在键的映射时,我无法找到有关返回值类型的任何文档。从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字段中的空字符串""

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

2 个答案:

答案 0 :(得分:17)

使用索引功能:

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

playground example

当键不在地图中时,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上尝试这些。