Go におけるマップ値の非アドレス指定可能
Go では、マップ値は C のように直接アドレス指定できません。これは、マップ内のエントリのアドレスを取得しようとすると明らかになります。以下のコードを考えてみましょう:
import "fmt" func main() { var mymap = make(map[int]string) mymap[1] = "One" var myptr *string = &mymap[1] fmt.Println(*myptr) // Generates error }
このコードは、「マップ値のアドレスを取得できません」というエラーをトリガーします。ただし、アドレスを取得する前に中間文字列変数を使用して値を格納すると、コードは問題なく実行されます。
import "fmt" func main() { var mymap = make(map[int]string) mymap[1] = "One" mystring := mymap[1] var myptr *string = &mystring fmt.Println(*myptr) // Works }
マップ値はアドレス指定できないのはなぜですか?
マップ値の直接アドレス指定に対する禁止は、Go のマップの内部実装に起因します。おそらく、それらは一種のハッシュ テーブルとして実装されます。ハッシュ テーブルの動的な性質により、挿入と削除が可能になり、既存のエントリのアドレスが無効になる可能性があります。
このようなエラーから保護するために、Go はマップ値のアドレス指定を禁止します。これにより、基礎となるハッシュ テーブルが再編成されても、取得された値が有効なままであることが保証されます。
値の間接的なアドレス指定
マップ値の直接的なアドレス指定は禁止されていますが、間接的なアドレス指定は可能です。許可された。これは、値を直接変更することなく、変数がマップ エントリの値を保持できることを意味します。次の例を考えてみましょう:
var mystring string = mymap[1] // Indirect addressing
この行は、mymap 内のキー 1 を持つエントリの値を mystring に割り当てます。 mymap への変更は mystring に反映されます。ただし、mystring は不変であり、その値を変更しようとするとエラーが発生します。
結論
Go におけるマップ値のアドレス指定不可能性は設計上の選択です。これは、基になるデータ構造が再編成された場合でも、マップから取得した値が有効なままであることを保証することを目的としています。この制限により、マップ エントリのアドレスが保存され、その後マップが変更された場合に発生する可能性のあるエラーが防止されます。他のプログラミング言語ほどの柔軟性は提供できないかもしれませんが、Go のマップ実装の安定性と予測可能性に貢献します。
以上がGo でマップ値を直接指定できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。