既然您已经弄清楚了,您对术语“ 接收者”
而不是指针/值的区别感到困惑。在Go中,“接收器”是指为接口目的而在方法上定义的值。您可以将接收器视为函数的第一个参数的特例。
func (m MyStruct) DoStuff()
这就是所谓的“值接收器”,它在 值 MyStruct 上定义。这在功能上等同于:
func DoStuff(m MyStruct)
除:
使用“接收器”,您可以使用“。”来调用函数,就像在许多OO语言中一样:
m := MyStruct{} m.DoStuff() // as opposed to DoStuff(m)类型是接收者的一组方法定义了它实现的接口:
type DoesStuff interface { DoStuff()}func DoSomething(d DoesStuff) { d.DoStuff()}func main() { m := MyStruct{} DoSomething(m)}那么什么是指针接收器?看起来像这样:
func (m *MyStruct) DoOtherStuff()
区别恰恰是指针和值之间的区别。尽管会发生轻微的语义变化。Go会自动寻址和自动取消引用指针(在大多数情况下),因此
m := MyStruct{};m.DoOtherStuff()Go仍然可以工作,因为Go会自动(&m).DoOtherStuff()为您服务。(自然,您也可以自由地做
m :=&MyStruct{}; m.DoOtherStuff)。此外,接口是在指针上定义的,因此:type DoesOtherStuff interface { DoOtherStuff()}func DoSomethingElse(d DoesOtherStuff) { d.DoOtherStuff()}func main() { m := MyStruct{} // DoSomethingElse(m) will fail since because the interface // DoesOtherStuff is defined on a pointer receiver and this is a value DoSomethingElse(&m)}如果您仍然对 何时
使用指针接收器与变量接收器感到困惑,那么简短的答案是:可能是指针接收器。长答案已经被回答了好几次,但是我将其链接到这里仅仅是因为在我的历史记录中很容易找到它。



