Calling pointer receiver method with non pointer value


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 (

type person struct {
    name string

type human interface {
    speak() string

func (p *person) speak() string {
    return "Speak() called by " +

func saySomething(h human) {
    fmt.Println("area", h.speak())

func main() {
    p := person{"harsh"}

    //doesn't work



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.

Answered By – Andy Schweig

Answer Checked By – Senaida (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.