我一直在收到关于指针接收器的错误,我决定谷歌这些术语的意思,我读了不同的来源和文档谈论指针接收器.例如:http://golang.org/doc/faq和http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go.
虽然,尽管他们谈论这些术语,但他们未能准确地定义它们.虽然,从上下文我认为它们之间的区别是将变量定义为像*MyStructvs 一样的指针MyStruct.虽然,我不是100%肯定他们的差异,但我想对这些术语,特别是他们的差异(指针接收器和值接收器)有更正式或更确切的理解.如果可能的话,一些简单的示例代码显示它们在go中的区别将是非常棒的!(也许有必要真正理解这一点)
例如,令我困惑的是,术语指针和指针接收器之间有什么区别?或价值和价值接收者?接收器这个术语添加了什么?
既然你澄清了你对术语接收者感到困惑而不是指针/值的区别.在Go中,"接收器"是指为了接口而定义方法的值.您可以将接收器视为函数的第一个参数的特例.
func (m MyStruct) DoStuff()
Run Code Online (Sandbox Code Playgroud)
这就是所谓的"值接收器",它是在值 MyStruct 上定义的.这在功能上与:
func DoStuff(m MyStruct)
Run Code Online (Sandbox Code Playgroud)
除了:
使用"接收器",您可以使用"."调用该函数,就像在许多OO语言中一样:
m := MyStruct{}
m.DoStuff() // as opposed to DoStuff(m)
Run Code Online (Sandbox Code Playgroud)
类型是接收器的方法集定义了它实现的接口:
type DoesStuff interface {
DoStuff()
}
func DoSomething(d DoesStuff) {
d.DoStuff()
}
func main() {
m := MyStruct{}
DoSomething(m)
}
Run Code Online (Sandbox Code Playgroud)
什么是指针接收器?它看起来像这样:
func (m *MyStruct) DoOtherStuff()
Run Code Online (Sandbox Code Playgroud)
差异正是指针和值之间的差异.虽然发生了轻微的语义变化.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)
}
Run Code Online (Sandbox Code Playgroud)
如果您仍然对何时使用指针接收器与可变接收器感到困惑,那么简短的回答是:可能是指针接收器.很长一段时间已经回答了很长的答案,但我会在这里链接,因为它很容易在我的历史中找到.