func (this *SA) Method()
means that only a pointer to type SA
(*SA
) has the Method()
method, therefore var i IA = &SA{}
fulfils the IA
interface.
If you change it to read func (this SA) Method()
then var i IA = SA{}
fulfils the interface, and not var i IA = &SA{}
.
*SA
is not the same type as SA
.
Go provides some shortcuts for dealing with dereferencing method values (which is probably where the confusion is coming from)
If you have a look at the Method Values section of the spec you will see that:
a reference to a non-interface method with a value receiver using a pointer will automatically dereference that pointer
and
a reference to a non-interface method with a pointer receiver using an addressable value will automatically take the address of that value
This is why obj.Method()
works whether obj
is an *SA
or an SA
.
Hope that helps.