关于Go中的接口

type IA interface {
    Method()
}

type SA struct {
}

func (this *SA) Method() {

}


func main() {
    var i IA = SA{} //error 
    var i IA = &SA{} //ok
    var obj = SA{}

    obj.Method()//ok     

}   

Could you explain why does GO automatically dereference in the case of calling function (obj.Method()) but in assignment to interface variable (var i IA = SA{}) it can't?

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.