複数のマップのキーの存在を同時に確認する
質問:
Go では、複数のマップに同じキーが存在するかどうかを確認する場合、1 つの方法は if 内で ok フラグを使用することです。
if v1, ok1 := map1["aaa"]; ok1 { ... } if v2, ok2 := map2["aaa"]; ok2 { ... }
ただし、これら 2 つの条件を 1 つに凝縮することが望ましいです。これは単一の if ステートメントで実現できますか?
答え:
残念ながら、単一の if 条件を使用して複数のマップでキーの存在チェックを実行することはできません。 Go 言語仕様では、v, ok := m[k] 形式の代入または初期化でインデックス式 (map1["aaa"] など) が追加の型なしブール値 (ok) を生成することを義務付けています。
これは、特別な v, ok := m[k] 形式は、他に何も割り当てられていない場合にのみ使用できることを意味します。ただし、マップの値の型がインターフェイス型で、nil 値が使用されない場合は、別のアプローチがあります。この場合、単純なタプル代入を使用できます。
if v1, v2 := m1["aaa"], m2["aaa"]; v1 != nil && v2 != nil { fmt.Printf("Both maps contain key '%s': %v, %v\n", "aaa", v1, v2) }
このプロセスをさらに簡略化するために、キー チェックを実行し、両方のマップの値と ok フラグを返すヘルパー関数を作成できます。
func idx(m1, m2 map[string]interface{}, k string) ( v1, v2 interface{}, ok1, ok2 bool) { v1, ok1 = m1[k] v2, ok2 = m2[k] return }
次に、この関数を使用してシングルステップを実行できます。 check:
if v1, v2, ok1, ok2 := idx(m1, m2, "aaa"); ok1 && ok2 { fmt.Printf("Both maps contain key '%s': %v, %v\n", "aaa", v1, v2) }
これらのテクニックを活用することで、Go で複数のマップのキーの存在を効率的に確認できます。
以上が複数の Go マップでキーの存在を同時に効率的に確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。