gpt4 book ai didi

go - Go 中的结构类型和多态性 - 编写可以对具有相同字段的两种类型进行操作的方法

转载 作者:IT王子 更新时间:2023-10-29 01:23:24 28 4
gpt4 key购买 nike

在尝试使用 Scala 和 OCaml 等其他语言的结构类型之后,我开始研究 Go,并且我正在尝试在这些语言之间映射一些惯用技术。考虑以下类型

type CoordinatePoint struct {
x int
y int
// Other methods and fields that aren't relevant
}

type CartesianPoint struct {
x int
y int
// Other methods and fields that aren't relevant
}

假设我们想编写一个对这两种类型进行操作以计算它们的极坐标表示的方法,func ConvertXYToPolar(point XYPoint) PolarPoint。如果 CartesianPointCoordinatePoint 类型为 xy 字段定义了 getter 和 setter 方法,我们可以定义 XYPoint 作为这些方法的通用接口(interface),允许我们对这两种类型进行操作,但就目前而言,接口(interface)不能声明字段,只能声明方法。

基于此,我有几个问题:

  1. 在 Go 中处理这个问题的惯用方法是什么?
  2. 是否可以在不修改现有类型的情况下完成?
  3. 我们能否保持类型安全,即避免定义 ConvertXYToPolar 而不使用空接口(interface)类型作为参数并手动转换?
  4. 如果接口(interface)和隐式接口(interface)满足是 Go 中实现多态性的主要工具,那么接口(interface)定义中禁止字段是否有限制?
  5. 是否通常在结构上定义 getter/setter 方法来规避此限制?
  6. 在接口(interface)定义中支持字段的设计决策背后是否有令人信服的理由?

我发现嵌入式类型、隐式接口(interface)满足和基于接口(interface)的多态性的简单性是非常简单和吸引人的技术组合,可以提高代码的可重用性和可维护性,但禁止接口(interface)定义中的字段从我的角度来看,这使得 Go 的结构类型功能有些受限。我是否缺少一个简单的解决方案?

最佳答案

通常的方法是使用组合:

type Point struct {
x int
y int
}

type CoordinatePoint struct {
Point
other stuff
}

type CartesianPoint struct {
Point
Other methods and fields that aren't relevant
}

Go 语法使这种组合在其他语言中感觉更像是继承。例如,您可以这样做:

cp := CoordinatePoint{} 
cp.x = 3
log.Println(cp.x)

你可以调用以Point为参数的函数

doAThingWithAPoint(cp.Point)

为了让你的点可以互换传递,你必须定义一个接口(interface)

type Pointer interface {
GetPoint() *Point
}
func (cp CoordinatePoint) GetPoint() *Point {
return &cp.Point
}

然后您就可以定义采用指针的函数:

func doSomethingWith(p Pointer) {
log.Println(p.GetPoint())
}

另一种解决方案是基于定义GetXSetXGetYSetY 的接口(interface),但我个人认为发现这种方法比必要的更繁琐和冗长。

关于go - Go 中的结构类型和多态性 - 编写可以对具有相同字段的两种类型进行操作的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15703818/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com