Golang接口和结构体组合陷阱

之前学习Golang对于接口interface和结构体struct的组合使用感到特别的不适应,但是在实现某些功能时由于需要调整代码结构而不得不将接口和结构体组合起来使用。

在使用Go语言的时候,接口组合是不可避免的,但是由于Go不是完全面向对象的语言,也就是只能使用 interfacestruct 来表示所谓的对象。 但是在使用时对于struct和interface怎么组合使用,以及需要注意的问题,这里我大致分为以下几种情况:

  • struct结构体组合interface接口: 对于结构体中组合接口这种情况来说,不可以看作是结构体已经实现了接口,但是结构体对象可以直接调用接口的方法,然而还必须分以下几种情况:
    • 结构体没有实现接口的方法,那么结构体对象不能调用接口的任何方法,否则 Panic nil
    • 结构体只实现了接口的部分方法,那么结构体对象只能调用对应已经实现的方法,对于其他的方法调用 Panic nil
    • 结构体完全实现接口的所有方法,那么结构体对象可以调用接口的所有方法,这种情况称之为面向对象中的接口方法实现。
      • 总之就是,如果struct完全实现interface所有方法,但是struct中组合了该interface,那么并不能说明该interface字段一定不为nil。 因此只要struct组合任何interface、struct、指针类型对象,都应该对该字段进行 初始化!!!
  • struct结构体X组合struct结构体Y: 对于这种情况,如果结构体X中组合的是结构体而非结构体指针,那么内部的结构体是一个零值,否则是一个nil指针。对于组合的是一个struct指针且为nil,还是可以调用结构体Y的方法的(但是需要注意的是调用的方法不能引用到对象Y的字段值,换句话说就是只能是 纯方法,这种情况C++也存在),如果想要直接调用内部结构体Y的方法,那么还是根据情况初始化内部结构体/指针结构体Y
    • 结构体,可以访问,但是可能读取到零值的字段
    • 结构体指针Y,如果不为nil,则可以正常访问;否则当指针为nil时,分以下两种情况讨论(即:空指针nil调用了成员方法)
      • 当结构体Y的方法有引用结构体的字段时,访问会 Panic nil
      • 当结构体Y的方法没有引用结构体字段X时,可以访问该纯方法
  • interface接口组合interface接口: 接口组合接口这种情况比较简单,相当于在当前接口的基础上扩展方法集

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!