考虑以下示例。我不完全理解“在后台”发生了什么并寻求解释。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]}
}