44

次のことを前提としています

type User struct {
    name string
}

users := make(map[int]User)

users[5] = User{"Steve"}

マップに格納されている構造体インスタンスにアクセスできないのはなぜですか?

users[5].name = "Mark"

マップに格納された構造体にアクセスする方法、またはそれが不可能な理由の背後にあるロジックに光を当てられる人はいますか?

ノート

構造体のコピーを作成し、コピーを変更し、マップにコピーして戻すことでこれを実現できることはわかっていますが、これはコストのかかるコピー操作です。

また、構造体ポインターをマップに格納することでこれを実行できることも知っていますが、それも行いたくありません。

4

2 に答える 2

65

根本的な問題は、マップ内のアイテムの住所を取得できないことです。コンパイラがこれに再配置すると思うかもしれませusers[5].name = "Mark"

(&users[5]).name = "Mark"

しかし、それはコンパイルされず、このエラーが発生します

cannot take the address of users[5]

これにより、マップはメモリを効率的に使用するために自由に順序を変更できます。

マップで何かを明示的に変更する唯一の方法は、それに値を割り当てることです。

t := users[5]
t.name = "Mark"
users[5] = t

したがって、上記のコピーを使用するか、マップにポインターを保存する必要があると思います。ポインタの格納には、より多くのメモリとより多くのメモリ割り当てを使用するという欠点があります。これは、上記のコピー方法よりも重要な場合があります。それは、あなたとあなたのアプリケーションだけが知ることができます。

users := make(map[int]User)3 番目の選択肢は、スライスを使用することです。元の構文は、次のように変更すると完全に機能します。users := make([]User, 10)

于 2013-07-03T09:08:07.637 に答える