我这里有一个Go程序,用于测试更大的http服务程序中出现的指针错误。
我有一个结构的指针,我想将其传递给函数以对其进行初始化。自然,因为它是一个指针,所以我不必返回任何东西。应该直接对其进行修改。
但是,这不是这里发生的事情。
func main () {
var thing *Thing
ModifyThing(thing)
fmt.Println(thing)
}
func ModifyThing (thing *Thing) {
thing = NewThing()
}
func NewThing () *Thing {
thing := Thing{}
return &thing
}
/// Output: <nil>
如果我直接在NewThing()
上使用thing
,我将得到一个初始化的指针。但是,当我将指针传递给调用相同方法的函数时,此方法不起作用。我的thing
的存储位置是否未按预期传递?
答案 0 :(得分:4)
您的ModifyThing
实际上并没有修改thing
。它使用指向thing
的新实例的新指针覆盖其局部变量Thing
,因此对其他任何内容均无影响。如果它是实际修改的 thing
-例如thing.field = newValue
,它将反映在调用者中。
如果您想覆盖指针所指向的整个值,也可以这样做,但是您必须显式覆盖所指向的内存,而不是指针本身:
*thing = Thing{}
请注意,我们取消引用 *thing
,并使用新的Thing
(而不是新的*Thing
!)覆盖其值
Go中的所有内容都按值传递,包括指针。指针指向一个内存地址,该地址可以是一个共享值。但是指针本身仍会在函数调用时复制。