2016-01-21 59 views
6

我無法找到任何有關返回值類型的文檔,這些文檔在嘗試鍵入不存在關鍵字的映射時是如此。從轉到bug跟蹤這似乎是一個特殊的「沒有價值」Go模板比較運算符關於丟失的map key

我試圖用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

從這我假設零值不是空字符串""因爲它是在圍棋本身。

有沒有簡單的方法來比較一個可能不存在的地圖值和另一個值?

回答

10

使用指數函數:

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

playground example

當鑰匙不在地圖索引函數返回映射值類型的零值。問題中地圖的零值是空字符串。

+0

一個非常優雅的解決方案。謝謝。 – Sam

+0

也適用於舊版本的Go,與使用{{if}}/{{with}}的解決方案不同 –

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存在,但相關的值是"",這也將導致"Key not found"

Go Playground上試試這些。

+0

很好的答案,只是想指出我發現的一個警告。如果鍵的值是空字符串,則這不起作用。 [GoPlay](https://play.golang.org/p/C7KRIjwkXAE) –

+0

@LiamKelly是的,你是對的,因爲值類型的零值被視爲'假'條件。同樣的事情也適用於其他(接受的)答案。 – icza