2

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()
}
1

1 Answer 1

2

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.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.