- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在尝试使用 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
和 CoordinatePoint
类型为 x
和 y
字段定义了 getter 和 setter 方法,我们可以定义 XYPoint
作为这些方法的通用接口(interface),允许我们对这两种类型进行操作,但就目前而言,接口(interface)不能声明字段,只能声明方法。
基于此,我有几个问题:
ConvertXYToPolar
而不使用空接口(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())
}
另一种解决方案是基于定义GetX
、SetX
、GetY
和SetY
的接口(interface),但我个人认为发现这种方法比必要的更繁琐和冗长。
关于go - Go 中的结构类型和多态性 - 编写可以对具有相同字段的两种类型进行操作的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15703818/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!