Go似乎并没有传递我的想法

时间:2019-01-04 20:37:03

标签: pointers go struct

我这里有一个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的存储位置是否未按预期传递?

1 个答案:

答案 0 :(得分:4)

您的ModifyThing实际上并没有修改thing。它使用指向thing的新实例的新指针覆盖其局部变量Thing,因此对其他任何内容均无影响。如果它是实际修改的 thing-例如thing.field = newValue,它将反映在调用者中。

如果您想覆盖指针所指向的整个值,也可以这样做,但是您必须显式覆盖所指向的内存,而不是指针本身:

*thing = Thing{}

请注意,我们取消引用 *thing,并使用新的Thing(而不是新的*Thing!)覆盖其值

Go中的所有内容都按值传递,包括指针。指针指向一个内存地址,该地址可以是一个共享值。但是指针本身仍会在函数调用时复制。