go - 在实现相同接口(interface)的多个结构上定义方法

标签 go

拿下面这段代码:

type A struct { … }
func (a *A) Attr() int { … }

type B struct { … }
func (b *B) Attr() int { … }

type I interface{
  Attr() int
}

func (m that implements I) Process() int {
  do something with m.Attr()
}

func main() {
  a := A{}
  a.Process()
  b := B{}
  b.Process()
}

不能在接口(interface)上定义方法,因此 m 不能是 I 类型。我尝试在 AB 上使用匿名字段,但 Attr 是特定于关联结构的,因此它不能在匿名字段上实现。

我想避免在 AB 上复制/粘贴 Process() 方法,因为它们完全相同。我可以简单地定义

func Process(m I) int { … }

相反,但它不是很优雅。

您将如何以可行的方式执行此操作?

最佳答案

这在 Go 中目前是不可能的。虽然您可以通过在结构中嵌入另一种类型来为多种类型引入通用方法,但这些方法并不知道它们所嵌入的类型。

此模式的常用 Go 习惯用法是使用函数。例如,sort package来自标准库。它defines an interface由在容器上实现排序算法所需的方法组成(LenLessSwap)。然而,实际的排序算法is exposed as a function它采用实现接口(interface)的参数。

关于go - 在实现相同接口(interface)的多个结构上定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27452427/

相关文章:

json - 在 Go 中查找并删除嵌套的 json 对象

json - 合并结构 slice

mongodb - 如何在 Docker compose 中运行一次命令

windows - 用 Go 编写的目录 walker 因文件正在使用(锁定)错误而停止

xml - 解析 xml(来自 Oracle Agile)返回 nil

mongodb - 如何在 Go 中使用 mgo 对文档进行部分和全部更新

go - 将自定义层添加到捕获的数据包失败

json - 如何在响应正文中单独设置错误代码和编码 json?

go - 用gRPC推送数据可以吗?

go - 将 Go 微服务保存在 Github 上的不同存储库中