2016-01-21 19 views
6

が欠落上の私は、キーが存在しないマップにキーをしようとすると、戻り値の型が何であるかについて、任意のドキュメントを見つけることができません。囲碁バグトラッカーから、私がeq機能を使用して2つの値を比較しようとしている特別な「何の価値」ゴーテンプレート比較演算子マップキー

をしないように見えますが、キーが存在しない場合はエラーを与える

例:

このことから error calling eq: invalid type for comparison

var themap := map[string]string{} 
var MyStruct := struct{MyMap map[string]string}{themap} 

{{if eq .MyMap.KeyThatDoesntExist "mystring"}} 
    {{.}} 
{{end} 

結果は、私はそれが行くそのものにあるとnilの値が空の文字列""ではないことを前提としています。

潜在的に存在しないマップ値と別の値を比較するための簡単な方法はありますか?

答えて

10

インデックス関数を使用します。問題のマップのゼロ値は空の文字列です。

+0

非常に洗練されたソリューションです。ありがとうございました。 – Sam

+0

{{if}}/{{with}}を使用するソリューションとは異なり、古いバージョンのGoでも動作します。 –

1

あなたは、最初のキーがマップ内にあるかどうかを確認し、それだけであれば、比較を行うことができます。別の{{if}}アクションで確認するか、パイプラインを設定するアクション({{with}})で確認することができます。別の{{if}}を使用して

{{with .MyMap.KeyThatDoesntExist}}{{if eq . "mystring"}}Match{{end}}{{end}} 

{{with}}を使用して

あなたが他のケースをカバーするために{{else}}枝を追加することができます

{{if .MyMap.KeyThatDoesntExist}} 
    {{if eq .MyMap.KeyThatDoesntExist "mystring"}}Match{{end}}{{end}} 

注意。キーはなく、関連付けられた値が存在する場合は、完全なカバレッジ変異体の全てにも"Key not found"になりますよう、""であること

{{if .MyMap.KeyThatDoesntExist}} 
    {{if eq .MyMap.KeyThatDoesntExist "mystring"}} 
     Match 
    {{else}} 
     No match 
    {{end}} 
{{else}} 
    Key not found 
{{end}} 

注:{{if}}

{{with .MyMap.KeyThatDoesntExist}} 
    {{if eq . "mystring"}} 
     Match 
    {{else}} 
     No match 
    {{end}} 
{{else}} 
    Key not found 
{{end}} 

フルカバー:{{with}}との完全なカバレッジ。

Go Playgroundにこれらを試してみてください。キーがマップされていないとき

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

playground example

指数関数は、マップ値型のゼロ値を返す:

+0

偉大な答え、ちょうど私が見つけた警告を指摘したい。キーへの値が空文字列の場合、これは機能しません。 [GoPlay](https://play.golang.org/p/C7KRIjwkXAE) –

+0

@LiamKelly値のタイプのゼロ値が「偽」条件として扱われるので、そうです。他の(受け入れられた)答えに対しても同じことが起こります。 – icza