![](/img/trans.png)
[英]Calling a method with a pointer receiver by an object instead of a pointer to it?
[英]Calling pointer receiver method with non pointer value
请参见下面的代码。 我知道非指针接收器可以接受指针和非指针值,但是指针接收器只能接受指针值。 话虽这么说,我不明白最后一个电话是如何工作的,倒数第二个电话却没有。 ( 在这里跑 )
问题是我可以从非指针方法调用指针接收器方法。 在另一个类似的问题中没有对此进行解释。 该答案仅说明了有关指针调用指针接收器方法的信息。
package main
import (
"fmt"
)
type person struct {
name string
}
type human interface {
speak() string
}
func (p *person) speak() string {
return "Speak() called by " + p.name
}
func saySomething(h human) {
fmt.Println("area", h.speak())
}
func main() {
p := person{"harsh"}
//works
saySomething(&p)
//doesn't work
//saySomething(p)
//works
p.speak()
}
第二个调用不起作用,因为类型person
没有实现human
界面(只有*person
可以实现)。 允许您使用非指针值的指针接收器调用方法的“魔术”,反之亦然,仅适用于那些特定情况。 在将值分配给接口变量或字段或将其作为需要接口的参数传递时,值的类型必须实现接口。
如果要调用p.speak()
,则编译器会自动将其更改为(&p).speak()
。 如果您有一个带有非指针接收器的方法,并且在指针上调用它,则在另一个方向上也会发生类似的转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.