【问题标题】:What do the terms pointer receiver and value receiver mean in Golang?Golang 中的术语指针接收器和值接收器是什么意思?
【发布时间】:2014-06-24 15:48:57
【问题描述】:

我在谈论有关指针接收器的内容时​​遇到了错误,我决定用谷歌搜索这些术语的含义,并阅读了有关指针接收器的不同来源和文档。例如:http://golang.org/doc/faqhttp://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go

尽管他们谈论了这些术语,但他们并没有准确地定义它们。不过,从上下文来看,我认为它们之间的区别在于将变量定义为指针,如 *MyStructMyStruct。虽然,我不能 100% 确定它们的区别,但我想对这些术语有一个更正式或更扎实的理解,特别是它们的区别(指针接收器和值接收器)。如果可能的话,一些简单的示例代码会显示它们在 go 中的差异,这将是很棒的! (可能有必要真正理解这一点)

例如,令我困惑的是,术语指针和指针接收器之间有什么区别?还是价值和价值接收者?接收者一词在这些概念中添加了什么?

【问题讨论】:

  • 您了解指针是什么,只是对方法接收器感到困惑,还是完全被指针/值的区别弄糊涂了?
  • 很有趣,你刚刚在我更新我的问题时问过。请查看我的更新。
  • 我觉得我知道指针是什么,我只是不知道指针与指针接收器或值与值接收器是什么,接收器一词对这些概念有何意义?

标签: pointers go


【解决方案1】:

自从您澄清以来,您对 receiver 一词而不是指针/值的区别感到困惑。在 Go 中,“接收者”指的是定义方法的值,用于接口。您可以将接收者视为函数第一个参数的特例。

func (m MyStruct) DoStuff()

这就是所谓的“值接收器”,它在 value 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 自动为您执行 (&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)
}

如果您仍然对 when 使用指针接收器与变量接收器感到困惑,简短的回答是:可能是指针接收器。长答案已经回答了好几次了,但我会链接here 只是因为它在我的历史中很容易找到。

【讨论】:

  • 当您对 m 进行解引用时,您的意思不是 (*m).DoStuff(),我虽然 & 返回了实际的指针/地址,而 * 进行了解引用,是这样吗?
  • @Pinocchio 我正在处理 m,而不是取消引用它。
猜你喜欢
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 2016-09-22
  • 2014-07-30
  • 2018-01-20
  • 2018-10-24
  • 2018-10-14
相关资源
最近更新 更多