次の例を考えてみましょう。「バックグラウンドで」何が起こっているのか完全には理解しておらず、説明を求めています。このバージョンでは、main関数からFoo
呼び出すと構造体のコピーが作成されるようです。AddToEntry
右?コードでこれを「証明」するにはどうすればよいですか?
goが構造体のコピーを作成するとき、私は構造体のコピーを操作しているだけで、main
関数に戻ると、以前と同じように元のファイルが表示されますか?
ポインタを期待する場合(コードのコメントを参照)、すべてが正常であり、構造体はコピーされません。この種の「エラー」をどのように回避できますか?構造体をコピーしていないことを確認するにはどうすればよいですか?そのためのコンパイル時/実行時チェックの可能性はありますか、それとも注意が必要ですか?
package main
import (
"fmt"
)
type Foo struct {
Entry []string
}
func MakeFoo() Foo {
a:=Foo{}
a.Entry = append(a.Entry,"first")
return a
}
// if I change (f Foo) to (f *Foo), I get
// the "desired" result
func (f Foo) AddToEntry() {
f.Entry = append(f.Entry,"second")
}
func main() {
f:=MakeFoo()
fmt.Println(f) // {[first]}
f.AddToEntry()
fmt.Println(f) // {[first]}
}