2016-11-22 8 views
0

こんにちは、Javaの世界から来た初心者です。Golangアレイアップデートが動作しません

package main 

import "fmt" 

type Foo struct { 
    A [5]int 
} 

func main() { 
    s := make([]Foo, 0) 
    var foo Foo 
    s = append(s, foo) 
    foo.A[0] = 42 
    fmt.Printf("%v", s[0].A) 
} 

しかし、これは私が予想[0,0,0,0,0]代わりの[42,0,0,0,0]を出力します。私は、プログラムのこの非常にシンプルな作品を持っています。行s = append(s, foo)foo.A[0] = 42を交換した後は、[42,0,0,0,0]と印刷されます。何故ですか?前もって感謝します。

答えて

1

sは、タイプがFooのスライスです。 Fooはstruct型です。構造体は、値に代入され、引数として渡されるか、またはスライスに追加され、値によってコピーされます。あなたはfooから参照を追加することを目的としながら、あなたのappendラインは、sfooコピーを追加しています。

あなたの構造体へのポインタsスライスを作成、修正するには:

s := make([]*Foo) 
var foo Foo 
s = append(s, &foo) 

playground link

ポインタはCだけで痛いそれらを経験した人たちに怖い見えるかもしれません。外出先では、何かをコピーしたり、リファレンスを渡したりするかどうかをコントロールできます。

+0

ありがとうございました!これは私の質問に対する完璧な答えです。 –

2

fooは現在のところsに追加されています。これにより、値fooがコピーされ、sに追加されたfooのコピーが作成されます。 sを印刷すると、fooアレイではなく、sに新しく作成された(0に初期化されたとき)fooが印刷されます。

あなたはs = append(s, foo)foo.A[0] = 42を切り替えると、あなたは同じことをやっているが、あなたがsに、42で、foo配列をコピーしているので、この時間は、あなたの期待される結果を見ています。 fooを再度変更する場合は、[42,0,0,0,0]