gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:59:47 25 4
gpt4 key购买 nike

我一直在谈论有关指针接收器的内容时​​遇到错误,因此我决定用谷歌搜索这些术语的含义,并阅读了有关指针接收器的不同来源和文档。例如: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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com