指针接收器和值接收器在Golang中是什么意思?

指针接收器和值接收器在Golang中是什么意思?,第1张

指针接收器和值接收器在Golang中是什么意思?

既然您已经弄清楚了,您对术语“ 接收者”
而不是指针/值的区别感到困惑。在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)}

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



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5001508.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-14
下一篇2022-11-14

发表评论

登录后才能评论

评论列表(0条)

    保存