doukeyong3746487 2014-07-31 05:16
浏览 80
已采纳

golang做继承的方法,解决方法

I understand golang does not support inheritance, but what is the right way to do in go for the following?

type CommonStruct struct{
  ID string
}

type StructA struct{
  CommonStruct
  FieldA string
}

type StructB struct{
  CommonStruct
  FieldB string
}

func (s *CommonStruct) enrich(){
  s.ID = IDGenerator()
}

how I can reuse the code in enrich for all other "sub struct" if the following function?

func doSomthing(s *CommoStruct){
  s.enrich()
}
  • 写回答

1条回答 默认 最新

  • duanlujiaji10335 2014-07-31 05:28
    关注

    You can use an interface:

    type MyInterface interface {
        enrich()
    }
    
    func doSomthing(s MyInterface){
      s.enrich()
    }
    

    Any struct that has each of the functions or methods of an interface defined is considered an instance of said interface. You could now pass anything with a CommonStruct to doSomething(), since CommonStruct defined enrich(). If you want to override enrich() for a particular struct, simply define enrich() for that struct. For example:

    type CommonStruct struct{
      ID string
    }
    
    type StructA struct{
      *CommonStruct
    }
    
    type StructB struct{
      *CommonStruct
    }
    
    type MyInterface interface {
        enrich()
    }
    
    func doSomething(obj MyInterface) {
        obj.enrich()
    }
    
    func (this *CommonStruct) enrich() {
        fmt.Println("Common")
    }
    
    func (this *StructB) enrich() {
        fmt.Println("Not Common")
    }
    
    func main() {
        myA := &StructA{}
        myB := &StructB{}
        doSomething(myA)
        doSomething(myB)
    }
    

    Prints:

    Common
    Not Common

    Test it here!.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答