Go——如何处理结构类型之间的公共字段

Posted

技术标签:

【中文标题】Go——如何处理结构类型之间的公共字段【英文标题】:Go — how to handle common fields between struct types 【发布时间】: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 方法,我可以定义一个包含这两种方法的接口。有没有字段的类比?

【问题讨论】:

【参考方案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 := &A1,2
b := &B&A3,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 但在这个例子中似乎不太可能。

以上是关于Go——如何处理结构类型之间的公共字段的主要内容,如果未能解决你的问题,请参考以下文章

kotlin 不确定如何处理插入方法的返回类型

如何处理类层次结构中的python装饰器?

如何处理以数组作为返回值的 go RPC 调用?

Web Api 如何处理这个查询字符串?

如何处理未定义的 Observable

如何处理 laravel 社交名媛“缺少授权异常”