V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
johnsneakers
V2EX  ›  Go 编程语言

看得好心累,到处都是 interface 的 go 代码该怎么阅读

  •  
  •   johnsneakers · 2017-10-24 01:54:19 +08:00 · 4047 次点击
    这是一个创建于 2594 天前的主题,其中的信息可能已经有所发展或是发生改变。
    同事写的一个比较大的功能里面,到处定义的 interface, 平均实现一个 interface 的类方法至少 3 个,大段大段的 if 多层嵌套,看得想自杀。
    32 条回复    2017-10-31 10:37:29 +08:00
    nomoon
        1
    nomoon  
       2017-10-24 01:58:55 +08:00
    if 是在转类型么?试试 case ?(虽然也好不到哪里去。。。
    johnsneakers
        2
    johnsneakers  
    OP
       2017-10-24 02:02:13 +08:00
    @nomoon if 嵌套是另外一个恶心的问题, 主要是他调一个 interface 方法有特么至少 3 个结构实现了这个方法, 我得一个一个看, 每个方法都特么乱七八糟 哎醉了
    wweir
        3
    wweir  
       2017-10-24 07:44:26 +08:00 via Android
    如果是不带 else 的 if 嵌套,是可以换种写法拉平的。

    三种以上具体实现的 interface 不是标准玩法么,要是只有一种实现,去用 interface 那才是恶心。你需要的是对代码的熟悉以及一个高度集成的 IDE
    zjsxwc
        4
    zjsxwc  
       2017-10-24 08:38:52 +08:00
    这个有点恶心, 把 golang 写得和动态语言一样, 后面根本不好维护
    nekoyaki
        5
    nekoyaki  
       2017-10-24 09:09:51 +08:00
    @zjsxwc
    我怎么觉得你说反了,虽说不看代码不好说,我第一反应是这人把 golang 写得和 java 一样……
    mikulch
        6
    mikulch  
       2017-10-24 09:17:41 +08:00
    @nekoyaki 不会吧 java 很少这么写代码的

    golang 这个语言 如果 java 都写不好的人真的不要碰。
    nekoyaki
        7
    nekoyaki  
       2017-10-24 09:26:14 +08:00
    @mikulch
    我的意思是 java 特别喜欢过度追求设计模式,别的语言里我感觉是没那么严重。
    到 golang 里很多不需要靠设计模式就能完成的逻辑,如果过度追求设计模式,就会写成大量 interface 的过度包装形式了。
    ZSeptember
        8
    ZSeptember  
       2017-10-24 09:33:03 +08:00
    一个 interface 没有多个实现,那还要这个 interface 做什么??
    yongzhong
        9
    yongzhong  
       2017-10-24 09:39:26 +08:00
    interface 不是本来就是用来抽象然后多实现的吗?
    cabing
        10
    cabing  
       2017-10-24 09:52:17 +08:00
    这样子很难维护~~
    你同事在坑你们项目组了。

    就不能封装下吗?至少 alias 一下。。
    zts1993
        11
    zts1993  
       2017-10-24 10:05:31 +08:00
    goland 可以分析
    janxin
        12
    janxin  
       2017-10-24 10:14:17 +08:00
    interface 不就是做这种抽象的嘛?不是很清楚,可能是 Java 程序员 XD
    HarrisonZ
        13
    HarrisonZ  
       2017-10-24 10:25:59 +08:00
    我用 interface 有时候只是为了把不通层的代码分开,不一定有多个实现。我是觉得这样更好读一些。比如 rpc 层只处理 rpc 本身的逻辑,至于数据具体的存取,就放在数据层实现,rpc 层定义自己需要的存取 interface,数据层实现。不一定一个 interface 就一定要有多个实现吧。
    SuperMild
        14
    SuperMild  
       2017-10-24 10:26:30 +08:00
    静态语言一切都在源代码里定义清楚了,这个 interface 的具体实现是什么,在前面肯定有声明的,很容易搞清楚,另外用好的 IDE 也能帮你自动分析。

    还可以善用 godoc,生成 html 文件看,结构非常清晰。
    SuperMild
        15
    SuperMild  
       2017-10-24 10:28:41 +08:00
    其实问题是项目本身复杂,用了 interface 已经算好的了,不用的话更难看
    mengzhuo
        16
    mengzhuo  
       2017-10-24 10:30:10 +08:00   ❤️ 1
    明显用错了

    比如 io.Reader 就只实现 Reader 的功能,不要再看各个 type 自己的实现才是 interface 的正确用法
    jameshuazhou
        17
    jameshuazhou  
       2017-10-24 10:49:49 +08:00
    能用就行了,至于代码、风格、神马之类的,当没有看到就好了。
    hjc4869
        18
    hjc4869  
       2017-10-24 10:51:17 +08:00
    @SuperMild golang 实现一个 interface 是 implicit 的,不需要声明实现,只要你实现了那几个函数就可以作为 interface 到处传,其实跟动态语言没啥区别,只是用鸭子类型的时候要先说好这个鸭子能干啥。
    pubby
        19
    pubby  
       2017-10-24 10:59:17 +08:00 via Android
    用 interface,if 都没毛病。看不到代码我们能说啥
    SuperMild
        20
    SuperMild  
       2017-10-24 11:11:37 +08:00
    @hjc4869 隐形实现并不影响分析,要当作 interface 用的时候还是必须先声明这个变量是个 interface 并且其具体实现是什么。

    例如 var i InterfaceFoo = TypeBar{"hello"} 就说明 i 是一个 interface,其具体实现是 TypeBar。
    araraloren
        21
    araraloren  
       2017-10-24 11:53:41 +08:00
    看不懂楼主在烦恼什么,鸭子类型就是这个样子,就拿 c++ 的模板来讲

    template <typename T>
    void doSomething(T& t)
    {
    t.doFoo();
    }

    你在这里不借助 IDE 也不好说传进来的 t 到底是个什么类型,因为只要实现了 doFoo 函数接口
    这里的调用就没有问题(类比于 golang 的 interface )
    lixm
        22
    lixm  
       2017-10-24 13:53:49 +08:00
    golang 的 interface 看起来确实很累,因为隐式实现, 尤其当 interface 的方法比较多的
    GeruzoniAnsasu
        23
    GeruzoniAnsasu  
       2017-10-24 13:57:05 +08:00
    到处都是 template 的 c++代码怎么阅读
    到处都是 interface 的 java 代码怎么阅读。。。。
    bk201
        24
    bk201  
       2017-10-24 14:02:20 +08:00
    @nekoyaki java 特别喜欢过度追求设计模式
    ====
    这是写代码的人而不是 java
    BBCCBB
        25
    BBCCBB  
       2017-10-24 14:09:55 +08:00
    ls +1, 辣鸡写什么都是辣鸡
    ChristopherWu
        26
    ChristopherWu  
       2017-10-24 14:26:18 +08:00
    啥需求会到处写 interface ?我认为都是在滥用了。。
    写过一年 go,用到 interface 的地方屈指可数。
    johnsneakers
        27
    johnsneakers  
    OP
       2017-10-24 14:38:30 +08:00
    @wweir 就是不熟悉代码,所以看完一个方法的三种实现特别费神,边看边猜到底在实现什么。

    @zts1993 我用的就是 goland, 请问咋分析, 这种实现 interface 的方法每次想看一跳转就跳到 interface 上面去啥都看不了。我现在要看都是 ctrl+f 全文搜哪些地方在实现这个方法,每个地方实现都要看一下。 想死
    zts1993
        28
    zts1993  
       2017-10-24 14:39:56 +08:00   ❤️ 1
    @johnsneakers #27 高版本 goland interface 上有箭头可以列出所有实现。和 java 差不多
    johnsneakers
        29
    johnsneakers  
    OP
       2017-10-24 14:40:23 +08:00
    @araraloren 因为 go 是隐式实现啊, 根本不知道这个地方的方法具体实现是在哪里,需要一个一个实现看。
    myself659410
        30
    myself659410  
       2017-10-25 09:15:31 +08:00
    interface 方便写代码,却实不方便读代码
    freestyle
        31
    freestyle  
       2017-10-29 23:50:12 +08:00
    >>>我用的就是 goland, 请问咋分析, 这种实现 interface 的方法每次想看一跳转就跳到 interface 上面去啥都看不了。>>>我现在要看都是 ctrl+f 全文搜哪些地方在实现这个方法,每个地方实现都要看一下。 想死
    @johnsneakers
    更新一下 goland, interface{}左边有绿色按钮点击可以列出有哪些 struct 实现了这个 interface
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2609 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 04:23 · PVG 12:23 · LAX 20:23 · JFK 23:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.