Please see the code below. I know it as a fact that a non pointer receiver can accept pointer and non-pointers values but a pointer receiver can only accept a pointer value. That being said, I fail to understand how the last call works and the second-last doesn't. ( Run Here )
The issue is that I am able to call a Pointer Receiver method from non pointer method. That is not explained in the other similar question . That answer explains only about the pointer calling pointer receiver method.
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()
}
The second call doesn't work because the type person
doesn't implement the human
interface (only *person
does). The "magic" that allows you to call a method with a pointer receiver on a non-pointer value and vice versa only applies to those specific cases. When assigning a value to an interface variable or field or passing it as a parameter that expects an interface, the type of the value must implement the interface.
If you were to call p.speak()
, the compiler would automatically change that to (&p).speak()
. A similar conversion happens in the other direction if you have a method with a non-pointer receiver and you call it on a pointer.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.