ホームページ > バックエンド開発 > Golang > Go でマップ値のアドレスを取得できないのはなぜですか?

Go でマップ値のアドレスを取得できないのはなぜですか?

Linda Hamilton
リリース: 2024-11-16 07:24:02
オリジナル
521 人が閲覧しました

Why can't I take the address of a map value in Go?

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])
}
ログイン後にコピー

マップの構造体の値の変更:

数値とは異なり、マップ内の構造体の値を変更するには次の手順が必要です:

  1. マップから構造体の値を取得します。
  2. 構造体の値を変更します。
  3. 変更した構造体の値をマップに保存します。

例:

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

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