英文:
Go Syntax of Pointer Receivers of a Method
问题
在Go语言中,可以为指针接收器定义方法。Go语言可以按照以下方式解释代码语法:
在方法的定义中,只需为接收器写入指针类型即可,在函数定义内部,您无需解引用指针即可访问内存中的对象。
在函数调用中,您不需要在指针类型上调用函数,我是指在引用上。Go语言可以理解您的意思。
type Box struct {
color string
}
var b Box
基于此,下面的golang代码片段等效的原因是什么?除了方便和代码简写之外,还有其他不同的原因吗?
Go语言的方式,但经典的C方式也可以工作:
func (b *Box) setColor(c string) {
b.color = c
}
b.setColor("blue")
经典的C方式:
func (b *Box) setColor(c string) {
(*b).color = c
}
(&b).setColor("blue")
英文:
In go one can define a method for a pointer receiver, as well. And Go can interpret the code syntax as follows:
In definition of the method, only writing the pointer type for the receiver is enough, inside the function definition you need not to dereference the pointer to access the very object in memory you want to access.
In function call, you do not need to call the function on a pointer type, on a reference I mean. Go can understand that you mean it.
type Box struct {
color string
}
var b Box
Based on that what is the reason for the golang code snippets are equivalent below? Are there a different reason other than convenience or code shorthand?
Go way, but the classical C way works, as well:
func (b *Box) setColor(c string) {
b.color = c
}
b.setColor("blue")
Classical C way:
func (b *Box) setColor(c string) {
(*b).color = c
}
(&b).setColor("blue")
答案1
得分: 2
这只是简单的速记,正如你所说:
根据规范:
方法值:
> 与方法调用一样,对于使用可寻址值的指针接收器的非接口方法的引用将自动获取该值的地址:t.Mp 等同于 (&t).Mp。
以及方法调用:
> 如果 x 的方法集包含 m 并且参数列表可以分配给 m 的参数列表,则方法调用 x.m() 是有效的。如果 x 是可寻址的并且 &x 的方法集包含 m,则 x.m() 是 (&x).m() 的速记。
英文:
It is as you say simply shorthand:
From the spec
> As with method calls, a reference to a non-interface method with a
> pointer receiver using an addressable value will automatically take
> the address of that value: t.Mp is equivalent to (&t).Mp.
>
And method calls:
> A method call x.m() is valid if the method set of (the type of) x
> contains m and the argument list can be assigned to the parameter list
> of m. If x is addressable and &x's method set contains m, x.m() is
> shorthand for (&x).m()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论