pointers - Golang 中的指针接收器和值接收器这两个术语是什么意思?

标签 pointers go

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

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

例如,让我感到困惑的是,术语指针和指针接收器之间有什么区别?或值(value)和值(value)接受者?接收器这个术语给这些概念增加了什么?

最佳答案

自从您澄清后,您对术语 receiver 而不是指针/值的区别感到困惑。在 Go 中,为了接口(interface)的目的,“接收者”指的是定义方法的值。您可以将接收器视为函数第一个参数的特例。

func (m MyStruct) DoStuff()

这就是所谓的“值接收者”,它在 MyStruct 上定义。这在功能上等同于:

func DoStuff(m MyStruct)

除了:

对于“接收器”,您可以使用“.”调用函数,就像在许多 OO 语言中一样:

 m := MyStruct{} 
 m.DoStuff() // as opposed to DoStuff(m)

类型作为接收者的方法集定义了它实现的接口(interface):

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)。此外,接口(interface)是在指针上定义的,因此:

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)
}

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

关于pointers - Golang 中的指针接收器和值接收器这两个术语是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24391062/

相关文章:

从数组中选择一个字符,然后替换第二个数组 - C

C 编程 - 将结构成员变量分配给 char *

go - golang 中的长查询

go - 为什么我的 golang channel 引发死锁错误?

go - 如何与本地主机上的 mysql 服务器建立连接?

c++ - 指向 void* 的类指针

c - 遍历后表被删除

c++ - `std::shared_ptr` 的智能指针模拟,带有用于将回调绑定(bind)到引用计数修改事件的 API,例如释放/保留……这是一回事吗?

google-app-engine - 从另一个应用程序/项目访问 Google Cloud Datastore

go - 在 mgo 中定义 MongoDB 架构/集合