【问题标题】:Go — how to handle common fields between struct typesGo——如何处理结构类型之间的公共字段
【发布时间】:2013-02-18 00:54:21
【问题描述】:

如果我有两种类型:

type A struct {
      X int
      Y int
}

type B struct {
      X int
      Y int
      Z int 
}

考虑到两个方法都访问同名字段并返回它们的总和,有没有什么方法可以在不需要两种方法的情况下实现以下目标?

func (a *A) Sum() int {
     return a.X + a.Y
}

func (b *B) Sum() int {
     return b.X + b.Y
}

当然,如果是 X 和 Y 方法,我可以定义一个包含这两种方法的接口。有没有字段的类比?

【问题讨论】:

    标签: types struct go


    【解决方案1】:

    B 中嵌入A

    type A struct {
          X int
          Y int
    }
    
    func (a *A) Sum() int {
         return a.X + a.Y
    }
    
    type B struct {
          *A
          Z int 
    }
    
    a := &A{1,2}
    b := &B{&A{3,4},5}
    
    fmt.Println(a.Sum(), b.Sum()) // 3 7
    

    http://play.golang.org/p/fjT9c-m_Lj

    但是不,没有字段接口。只有方法。

    【讨论】:

    • 我很想知道您为什么选择在 B 中嵌入指向 A 的指针,而不是直接在 B 中嵌入 A。愿意分享吗?
    • @jpp:正因为OP在指针接收器上有方法,所以我认为它会更清楚。同样在某些情况下,它会有所不同,例如 B 也是一个值而不是指针,并试图作为接口传递,如下所示:play.golang.org/p/k2e5saB7OI 但在这个例子中似乎不太可能。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2020-12-04
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    相关资源
    最近更新 更多