go 的链式语法继承问题有什么好的实现方法吗

2018-03-05 09:50:43 +08:00
 bigpigeon

比如 A 类和 B 类都有一个 Call 的 method,返回类型是它自身,并且内部逻辑几乎一样,有什么办法节省代码吗

type A struct{}

func (a A)Call() A {
...
return A{}
}

type B struct{}

func (b B)Call() B {
...
return B{}
}

我目前看到的唯一办法是像 refect.rtype 那样进行 unsafe point 的类型强转,但不知道这样会不会有 gc 问题

1677 次点击
所在节点    问与答
7 条回复
xwhxbg
2018-03-05 11:03:49 +08:00
```
func (a *A) Call() A{
return a
}
```
就行了,你这样 return 的每次都是个新的结构体,我猜测你想实现的是类似 js 可以 return this
bigpigeon
2018-03-05 11:13:57 +08:00
@xwhxbg 你理解错了,我是像把 A 的 call 和 B 的 call 中的相同部分不用写 2 份,目前好像没有办法,reflect.rtype 好像也不行
xwhxbg
2018-03-05 11:17:01 +08:00
哦,你是想实现 mixin 吧,就是有一部分代码逻辑是可以服用的,可以考虑 decorator,或者 type interface,比如在重复的代码里 A,B 都要有 bcd 方法,就写个 interface 包含 bcd 方法,然后 A,B 实现 interface
hjc4869
2018-03-05 11:24:29 +08:00
要是有的话还要泛型干啥🤣
bigpigeon
2018-03-05 11:28:14 +08:00
@xwhxbg 还是不行,因为 A,B 的 bcd 返回自身对象,而有些 method 是 A 有 B 没有,interface 化就必须让 B 对这些 method 做空实现
xwhxbg
2018-03-05 11:31:19 +08:00
emmmm,那样确实会反而更多代码了,哈哈,看来只能重复写了
bigpigeon
2018-03-05 11:40:34 +08:00
@hjc4869 是啊,感觉必须泛型或宏才能解决,遇到大量重复代码真想写个生成器,像 stringer 那样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/434836

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX