マップ内の値として構造体に値を設定すると、「割り当てできません」というエラーが発生するのはなぜですか? [重複] 質問する

マップ内の値として構造体に値を設定すると、「割り当てできません」というエラーが発生するのはなぜですか? [重複] 質問する

Go は初めてです。このエラーが発生しましたが、原因や根拠を見つけることができませんでした。

構造体を作成すれば、問題なく値を割り当てたり再割り当てしたりできるのは明らかです。

type Person struct {
 name string
 age int
}

func main() {
  x := Person{"Andy Capp", 98}
  x.age = 99
  fmt.Printf("age: %d\n", x.age)
}

しかし、構造体がマップ内の 1 つの値である場合:

type Person struct {
     name string
     age int
 }

type People map[string]Person

func main() {
  p := make(People)
  p["HM"] = Person{"Hank McNamara", 39}
  p["HM"].age = p["HM"].age + 1
  fmt.Printf("age: %d\n", p["HM"].age)
}

分かりましたcannot assign to p["HM"].age。それだけです。他の情報はありません。http://play.golang.org/p/VRlSItd4eP

私はこれを回避する方法を見つけました。PersonincrementAgeに関数を作成し、それを呼び出して結果をマップ キーに割り当てるというものですp["HM"] = p["HM"].incrementAge()

しかし、私の質問は、この「割り当てできません」エラーの理由は何なのか、そしてなぜ構造体の値を直接割り当てることができないのかということです。

ベストアンサー1

p["HM"]あまり一般的ではないアドレス可能価値:ハッシュマップは実行時に大きくなる可能性があるそして、その値はメモリ内で移動され、古い場所は古くなります。マップ内の値が通常のアドレス指定可能な値として扱われると、実装の内部がmap公開されることになります。

その代わりに、p["HM"]少し異なる「地図」と呼ばれるものがありますインデックス式仕様書で「インデックス式」というフレーズを検索すると、インデックス式を読んだり、インデックス式に代入したり、増分/減分式(数値型の場合)で使用したりできることがわかります。しかし、すべてを行うことはできません。実装を選択することもできます。もっと彼らは特別なケースをもっと多く扱いたかったのですが、単純に物事を単純化するためにそうしなかったのではないかと思います。

ここでのアプローチは良いようです。これを通常の代入に変更します。これは特別に許可された操作の1つです。別のアプローチ(コピーを避けたい大きな構造体に適しているかもしれません)は、マップ値を通常の古いポインタにする次の方法で基になるオブジェクトを変更できます。

package main

import "fmt"

type Person struct {
    name string
    age  int
}

type People map[string]*Person

func main() {
    p := make(People)
    p["HM"] = &Person{"Hank McNamara", 39}
    p["HM"].age += 1
    fmt.Printf("age: %d\n", p["HM"].age)
}

おすすめ記事