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

在使用其他语言(如 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这些方法定义为一个公共接口,允许我们对这两种类型进行操作,但就目前而言,接口不能声明字段,只能声明方法。

基于此,我有几个问题:

  1. 在 Go 中处理这个的惯用方法是什么?

  2. 可以在不修改现有类型的情况下完成吗?

  3. 是否可以保留类型安全,即避免在ConvertXYToPolar不使用空接口类型作为参数的情况下定义并手动转换?

  4. 如果接口和隐式接口满足是 Go 中实现多态的主要工具,那么接口定义中字段的禁止是否有限制?

  5. 是否通常在结构上定义 getter/setter 方法来规避此限制?

  6. 支持接口定义中的字段的设计决策背后是否有令人信服的理由?

我发现嵌入式类型的简单性、隐式接口满意度和基于接口的多态性是一种非常简单且吸引人的技术组合,可以提高代码的可重用性和可维护性,但是在接口定义中禁止字段使得 Go 的结构类型功能在我看来有些受限. 我错过了一个简单的解决方案吗?


HUX布斯
浏览 221回答 3
3回答

潇湘沐

通常,惯用的方法是使用 getter 和 setter。不太方便?也许。但至少目前是这样做的。是的。这就是鸭子打字的本质。任何与接口匹配的类型都将被接受,无需显式实现。编辑:根据对这个答案的评论,我误解了这个问题。答案是否定的,您需要为这些结构添加方法以匹配除interface{}.是的,使用 getter 和 setter。也许。我可以理解为什么 getter 和 setter 可能被认为不太方便。但据我所知,它们并没有严格限制您可以做什么。是的。这是我在其他人的代码和标准库中看到的方式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go