2017-02-08 5 views
-1

Goのマップルックアップが要素のコピーを返すようです。これは言語仕様で説明されているように見えることはできません。私は以下のようにprogramを書いた:go map lookupは要素のコピーを返しますか?

型T構造体{n個の整数}

m := make(map[string]T) 
t := T{123} 
m["123"] = t 
t0 := m["123"] 
t1 := m["123"] 
t0.n = 456 
t1.n = 789 
fmt.Println(t, t0, t1) 

Iとして出力を得た:{123} {456} {789}。要素のコピーが返されるたびに見えますか?

+1

あなたはスペックでこの動作が必要とされる場合に尋ねるか、まさにあなたの質問はされていますか? – Volker

+0

この動作が仕様で指定されているかどうかを確認しています。これはプログラムに意味を持っているからです。大きな値のオブジェクトを頻繁にマップ検索すると、メモリの割り当て/割り当て解除が多くなることがわかります –

+0

Ok。私の質問はNot_a_Golferによって説明されます。 "Goは参照を渡すことはありません。" –

答えて

5

goは参照を渡すことはありません。値を渡して代入時にコピーを作成するか、これらの値をポインタにすることができます。この場合、コピーは実際には参照用のポインタになります。

それではマップがfooのコピー、またはゼロ値はFooを返すアクセスすなわち

m := map[string]Foo{} 

、我々は値のマップを作るならば、我々は

type Foo struct { 
    Bar string 
} 

を持っているとしましょう

yはマップ内のオブジェクトとは異なるオブジェクトになりました。したがって、Barはマップ内のオブジェクトには影響しません。

しかし、私たちが行った場合、ポインタのマップマップ:それにアクセス後、

m := map[string]*Foo{} 

をして:

m["x"] = &Foo{"bar"} 
y := m["x"] 

yが今マップと同じオブジェクトへのポインタです。私たちは、そのBarを変更することができ、それがマップに影響します。

y.Bar = "wat" 
fmt.Println(m["x"].Bar) 

// Will print "wat" 

Playground example.

関連する問題