2016-06-01 13 views
0

公開変数をコピーするにはどうすればいいですか?公開変数をコピーするにはどうすればいいですか?

例えば、PublicVar

という名前のパブリックvariadble
a := []string{"A", "B"} 
b := a 
fmt.Printf("%v\n", a) 
fmt.Printf("%v\n", b) 

b[0] = "C" 
fmt.Printf("%v\n", a) 
fmt.Printf("%v\n", b) 
// a has been changed. 

はPublicVarの名前が変更されますが、これは私が欲しいものではありません。

私はPublicVarの値をコピーしたいだけです。

+1

'TEMP:= PublicVar'を**値をコピーしないと、何もしません。 Go(エクスポートまたは非エクスポート)変数の「名前を変更する」ことは不可能です。あなたは何をしようとしているのですか? – Volker

+0

@Volker実際にはtemp:= PublicVarは常に値をコピーしません。たとえば、PublicVarがスライス、チャネル、またはマップを参照している場合、tempもデータの同じコピーを参照します。 –

+1

@Nipunスライスのチャンネルとマップは参照型なので、そうです。 ':='の動作が異なるためではありません。それは常に*値*をコピーします。スライス、チャンネル、マップの場合、値は参照値です。 –

答えて

3

おそらくPublicVarがインスタンスへのポインタであるためです。したがってtempも同じインスタンスを指しています。次のようにして値の型を取得できます。

temp := *PublicVar 
temp.name = "bob" 

編集Playground

での例を参照してください。質問は懸念の変数がスライスで表示するように編集されているので、khrmのanswerは、より関連性があります。

+0

私がGoに欠けているものの中には、コンストラクタ、コピーコンストラクタ、C++でほぼ常に使用される代入演算子があります。この例でわかる混乱と危険は、C++でははるかに少ないです。 –

+0

私はスライスの値をコピーしたくないのですが、正しい方法は何ですか? – HeadwindFly

+0

HeadwindFly khrmの[回答]を参照してください(http://stackoverflow.com/a/37562171/1150725) –

1

値でコピーします。しかし、マップやスライスの場合は、参照型として実装されているため、参照のみがコピーされるという例外があります。スライスの場合

、あなたはこの組み込みのコピーを使用して行うことができます。マップの場合

b := make([]string, len(a)) 
copy(b,a) 

for k, v := range a { 
    b[k] = v 
} 
関連する問題