Go でのマップ値のアドレス指定可能
開発者は Go を使用しているときに、マップ値がアドレス指定できないという興味深い観察に遭遇することがあります。これは、次のコードに示すように、マップ値のアドレスを直接取得しようとすると明らかです:
var mymap map[int]string = make(map[int]string) mymap[1] = "One" var myptr *string = &mymap[1] fmt.Println(*myptr)
このコードはエラーを生成します:
mapaddressable.go:7: cannot take the address of mymap[1]
対照的に、次の場合マップ エントリの値を新しい変数に代入すると、そのアドレスを正常に取得できます。
var mymap map[int]string = make(map[int]string) mymap[1] = "One" mystring := mymap[1] var myptr *string = &mystring fmt.Println(*myptr)
この違いにより、なぜ値をマップするのかという疑問が生じます。 Go ではアドレス指定できません。これは意図的な設計上の選択ですか、それとも言語に固有の制限ですか?
この決定の背後にある理論的根拠を理解するには、Go でのマップの基礎となる実装を考慮することが重要です。マップは通常、エントリ数に基づいてメモリを動的に割り当てるハッシュ テーブルを使用して実装されます。新しいエントリが追加または削除されると、特定の負荷係数を維持するためにハッシュ テーブルのサイズが変更され、再編成されることがあります。
マップ値がアドレス指定可能であれば、値のアドレスを取得して直接変更することが可能です。 。ただし、その後ハッシュ テーブルのサイズが変更または再編成されると、元のアドレスが無効になる可能性があります。このような不一致を防ぐために、Go ではマップ値のアドレス指定可能性を制限しています。
Go におけるこの設計上の決定は、効率と単純さの間のトレードオフです。アドレス指定可能なマップ値を許可すると、ハッシュ テーブルの変更が正しく処理されない場合、エラーやメモリの問題が発生する可能性があります。 Go は直接アドレス指定を禁止することで、ある程度の柔軟性を犠牲にしてマップ データ構造の整合性を確保します。
これは、マップ値がアドレス指定可能な C のような言語とは対照的です。ただし、この柔軟性の向上には、ポインタを無効にすることなくマップの変更が安全に処理されることを保証するという責任が増大します。
以上がGo でマップ値をアドレス指定できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。