Go マップでの割り当て順序
次の Go コードを考えてみましょう:
package main import "fmt" type Vertex struct { Lat, Long float64 } var m map[string]Vertex func main() { m = make(map[string]Vertex) m["Bell Labs"] = Vertex{ 40.68433, 74.39967, } m["test"] = Vertex{ 12.0, 100, } fmt.Println(m["Bell Labs"]) fmt.Println(m) }
出力は次のとおりです:
{40.68433 74.39967} map[Bell Labs:{40.68433 74.39967} test:{12 100}]
ただし、テスト頂点の宣言に小さな変更が加えられた場合、右中括弧を 4 つ右に移動すると、
m["test"] = Vertex{ 12.0, 100, }
出力は次のように変わります。
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
疑問が生じます: このわずかな変更がマップの順序に影響を与えるのはなぜですか?
答え:
のマップの順序Go は、使用される基礎となるハッシュ関数に依存します。このハッシュ関数は、ハッシュの衝突を悪用するサービス拒否攻撃を軽減するためにランダム化されています。詳細については、次の問題トラッカーを参照してください:
http://code.google.com/p/go/issues/detail?id=2630
マップの順序に注意することが重要です。言語仕様では保証されていません。現在の Go 実装は安定した順序を維持しますが、将来のリビジョンではガベージ コレクションやその他の操作中にマップが圧縮される可能性があり、コードによってマップを明示的に変更しなくても順序が変更される可能性があります。したがって、マップの特定の順序に依存することは賢明ではありません。
Go 仕様で述べられているように:
マップは、1 つの型の要素の 順序のない グループです。 、要素タイプと呼ばれ、キー タイプと呼ばれる別のタイプの一意のキーのセットによってインデックスが付けられます。
以上がGo Map の割り当てでインデントを変更すると出力順序に影響するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。