douwu5009 2015-03-14 10:54
浏览 5

关于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?

  • 写回答

1条回答 默认 最新

  • dongzhou4727 2015-03-14 12:03
    关注

    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.

    评论

报告相同问题?

悬赏问题

  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)