ホームページ > バックエンド開発 > Golang > なぜ Go スライスをマップ キーとして使用できないのですか?

なぜ Go スライスをマップ キーとして使用できないのですか?

Susan Sarandon
リリース: 2024-11-19 05:45:02
オリジナル
637 人が閲覧しました

Why Can't Go Slices Be Used as Map Keys?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート