Go スライスをマップ キーとして使用する場合の制限
本質的に Go 配列の実装である Go スライスは、次の点で配列と類似点を共有します。それらの価値型の性質。ただし、マップ キーとしての適合性は配列の適合性とは大きく異なります。この違いは、スライスが基になる配列を参照するという事実に由来しており、これにより配列には存在しない複雑さが生じます。
Nigel Tao が説明しているように、スライスのコピーは、O(1 のおかげで配列をコピーするよりも大幅に高速です) ) 配列の O(長さ) の複雑さと比較した時間の複雑さ。この違いは、値の型 (配列) と参照型 (スライス) の違いを強調します。
マップ キーを定義するときは、同等の概念を確立する必要があります。配列の場合、等しいかどうかは、個々の要素を比較することによって直接判断されます。ただし、スライスの場合、等価性を定義する方法は複数あります。要素ごとの同等性、またはそれらが参照する基礎となる配列ストレージに基づく同等性を考慮してください。
さらに、マップにキーを挿入するという行為により、基礎となる配列全体の高価なコピーが必要かどうかについて不確実性が生じます。コピーは期待どおりに実行できますが、スライスの割り当て動作からは逸脱します。
これらの複雑さを説明するために、次の例を考えてみましょう。
m := make(map[[]int]bool) s0 := []int{6, 7, 8} s1 := []int{6, 7, 8} s2 := s0 m[s0] = true s2[0] = 9 println(m[s0]) println(m[s1]) println(m[s2])
プログラマーが、この結果は、スライスをマップ キーとして使用するときに混乱が生じる可能性を示しています。このような曖昧さを避けるために、Go ではスライスをマップ キーとして使用できないようにすることが選択されました。
以上がなぜ Go スライスをマップ キーとして使用できないのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。