Go でマップ値のアドレスを取得する
質問: なぜマップ値のアドレスを取得できないのですか? map value?
背景:
Go プログラミング言語では、マップ値のアドレスを取得するための「&」演算子の使用が制限されています。この動作は、「&」を使用して対処できるスライス値とは異なります。
誤解の明確化:
マップはメモリ構造によって裏付けられているという考えに反しています。配列と同様に、実際には動的に再編成されるバケット構造に格納されます。これは、マップ値には固定のメモリ位置がないことを意味します。
根本的な理由:
Go がマップ値のアドレス取得を禁止する主な理由は、地図データ構造の動的な性質。マップ エントリが作成、更新、または削除されると、バケットを再編成してパフォーマンスとメモリ使用量を最適化できます。マップ値にアドレスが許可されている場合、これらの再配置中に無効になります。
マップ内の数値変更:
ただし、「 」や「 =」などの演算子は使用できます。数値マップ値をインプレースで変更するために使用されるこの短縮形式は、実際には基になる値に直接アクセスしない一連の操作を実行します。
例:
func icandothis() { cmap := make(map[int]complex64) cmap[1] += complex(1, 0) fmt.Println(cmap[1]) }
短縮形式を展開すると、操作が実際に追加を実行する新しい一時値を作成し、それをマップに再度格納していることがわかります:
func icandothis() { cmap := make(map[int]complex64) v := cmap[1] v += complex(1, 0) cmap[1] = v fmt.Println(cmap[1]) }
マップの構造体の値の変更:
数値とは異なり、マップ内の構造体の値を変更するには次の手順が必要です:
例:
type Complex struct { R float32 I float32 } func (x *Complex) Add(c Complex) { x.R += c.R x.I += c.I } func main() { cmap := make(map[int]Complex) c := cmap[1] c.Add(Complex{1, 0}) cmap[1] = c fmt.Println(cmap[1]) }
次の手順に従うことで、構造体の値を変更できます。 - アドレスを必要とせずに配置します。
以上がGo でマップ値のアドレスを取得できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。