指针接收器混乱

I'm confused about the behaviour of the following code. playground

var foo json.RawMessage
_ = json.Unmarshal([]byte(`{ "zoo": 123 }`), &foo)

enc := json.NewEncoder(os.Stdout)

// Works as expected
_ = enc.Encode(struct{ Foo *json.RawMessage }{&foo})

// MarshalJSON has a pointer reciever, so it doesn't get invoked here
_ = enc.Encode(struct{ Foo json.RawMessage }{foo})

// How is MarshalJSON being invoked if .Foo is not a pointer?
_ = enc.Encode(&struct{ Foo json.RawMessage }{foo})

Output:

{"Foo":{"zoo":123}}
{"Foo":"eyAiem9vIjogMTIzIH0="}
{"Foo":{"zoo":123}}

I don't understand why the third call to json.Encoder.Encode is able to access json.RawMessage.MarshalJSON even though it's not a pointer.

When calling a method on any addressable value, Go will automatically reference the value to call methods with a pointer receiver.

type Foo struct{}
func (f *Foo) Call() {}

// f isn't a pointer, but is addressable
f := Foo{}
f.Call()

Also, if a non-pointer value is in an addressable struct, it can also be reference for methods requiring a pointer receiver.

type Bar struct {
    Foo Foo
}

// b is addressable, therefor so is b.Foo
b := Bar{
    Foo: f,
}
b.Foo.Call()

Your last example uses the address of the outer struct to get the address of the Foo field, and call MarshalJSON.