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