V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
bigpigeon
V2EX  ›  问与答

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

  •  
  •   bigpigeon · 2018-03-05 09:50:43 +08:00 · 1774 次点击
    这是一个创建于 2456 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 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 问题

    7 条回复    2018-03-05 11:40:34 +08:00
    xwhxbg
        1
    xwhxbg  
       2018-03-05 11:03:49 +08:00
    ```
    func (a *A) Call() A{
    return a
    }
    ```
    就行了,你这样 return 的每次都是个新的结构体,我猜测你想实现的是类似 js 可以 return this
    bigpigeon
        2
    bigpigeon  
    OP
       2018-03-05 11:13:57 +08:00
    @xwhxbg 你理解错了,我是像把 A 的 call 和 B 的 call 中的相同部分不用写 2 份,目前好像没有办法,reflect.rtype 好像也不行
    xwhxbg
        3
    xwhxbg  
       2018-03-05 11:17:01 +08:00
    哦,你是想实现 mixin 吧,就是有一部分代码逻辑是可以服用的,可以考虑 decorator,或者 type interface,比如在重复的代码里 A,B 都要有 bcd 方法,就写个 interface 包含 bcd 方法,然后 A,B 实现 interface
    hjc4869
        4
    hjc4869  
       2018-03-05 11:24:29 +08:00 via iPhone
    要是有的话还要泛型干啥🤣
    bigpigeon
        5
    bigpigeon  
    OP
       2018-03-05 11:28:14 +08:00
    @xwhxbg 还是不行,因为 A,B 的 bcd 返回自身对象,而有些 method 是 A 有 B 没有,interface 化就必须让 B 对这些 method 做空实现
    xwhxbg
        6
    xwhxbg  
       2018-03-05 11:31:19 +08:00
    emmmm,那样确实会反而更多代码了,哈哈,看来只能重复写了
    bigpigeon
        7
    bigpigeon  
    OP
       2018-03-05 11:40:34 +08:00
    @hjc4869 是啊,感觉必须泛型或宏才能解决,遇到大量重复代码真想写个生成器,像 stringer 那样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2695 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:28 · PVG 18:28 · LAX 02:28 · JFK 05:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.