2016-11-13 15 views
3

なぜ最初に構造体を読み込み、変更してマップに書き戻す必要がありますか?他のデータ構造(マップやスライスなど)の構造体のフィールドを変更する際に、暗黙の隠れたコストがいくつかありますか?Golang:私は構造体のマップを持っています。構造体値のフィールドを直接変更できないのはなぜですか?

編集: 私はポインタを使用することができますが、なぜはGoで許可されていないのですか?

type dummy struct { 
    a int 
} 
x := make(map[int]dummy) 
x[1] = dummy{a:1} 
x[1].a = 2 
+4

あなたは、構造体へのポインタのマップを作ることができます... – RickyA

+1

あなたが探しているように見えるの答えはここに用意されていますhttp://stackoverflow.com/questions/32751537/構造体を値として設定する際のエラーの原因がわからないのはなぜですか?ここでは:http://stackoverflow.com/questions/17438253/ access-struct-in-copying-without-copying –

答えて

5

値で構造体を格納すると、その構造体をマップに追加すると値のコピーが得られます。これを変更すると、マップ内の構造体は、新しいコピーで上書きされるまでは変更されません。

コメントでRickyAが指摘したように、代わりに構造体へのポインタを格納することができます。これにより、格納された構造体ポインタによって参照される構造体を直接変更できます。

すなわちmap[whatever]*struct代わりのmap[whatever]struct

+0

私はポインタの仕組みを理解しており、そのアクセスはあなたにコピーを与えます。おそらく私はそれを正しくフレーム化しませんでしたが、なぜ私の質問はGoの設計者が構造体フィールドの直接修正を許可しないことを選択したのですか? – kanu

+1

並列処理中の安全性。要素をハッシュに追加するとき、言語は多くの場合、すべての値をバックグラウンドで新しい(より大きな)ハッシュテーブルにコピーする必要があります。要素をメモリ内で直接変更することができれば、すべてのコピーを同期させることは不可能です。すべての更新操作が強制的に「ここで新しい値」である場合、両方のコピーが更新されることを確認するのは簡単です。これがなければ、ハッシュをコピーすることは「世界を止める」操作になります。 – BraveNewCurrency

+0

それは感謝します、ありがとう! – kanu

関連する問題