请参阅下面的代码。我知道非指针接收器可以接受指针和非指针值,但指针接收器只能接受指针值。话虽如此,我无法理解最后一次通话是如何工作的,倒数第二次也不是。 (Run Here)
问题是我能够从非指针方法调用指针接收器方法。 other similar question中没有解释这一点。该答案仅解释了指针调用指针接收器方法。
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()
}
答案 0 :(得分:1)
第二个调用不起作用,因为person
类型没有实现human
接口(只有*person
)。 "魔术"允许您在非指针值上调用带有指针接收器的方法,反之亦然,仅适用于那些特定情况。将值赋给接口变量或字段或将其作为需要接口的参数传递时,值的类型必须实现接口。
如果您要调用p.speak()
,编译器会自动将其更改为(&p).speak()
。如果你有一个带有非指针接收器的方法并且你在指针上调用它,那么在另一个方向上会发生类似的转换。