在使用其他语言(如 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
. 如果CartesianPoint
and类型为and字段CoordinatePoint
定义了 getter 和 setter 方法,我们可以定义为这些方法的公共接口,允许我们对这两种类型进行操作,但就目前而言,接口不能声明字段,只能声明方法。x
y
XYPoint
基于此,我有几个问题:
- 在 Go 中处理这个的惯用方式是什么?
- 可以在不修改现有类型的情况下完成吗?
- 我们能否保留类型安全,即避免
ConvertXYToPolar
在不使用空接口类型作为参数和手动转换的情况下进行定义? - 如果接口和隐式接口满足是 Go 中多态性的主要工具,那么接口定义中字段的禁止性是否受到限制?
- getter/setter 方法是否通常在结构上定义以规避此限制?
- 设计决定背后是否有令人信服的理由不支持接口定义中的字段?
我发现嵌入式类型的简单性、隐式接口满足和基于接口的多态性是一种非常简单且吸引人的技术组合,可以提高代码的可重用性和可维护性,但是接口定义中的禁止字段使 Go 的结构化类型功能在我看来有些受限. 我错过了一个简单的解决方案吗?