看得好心累,到处都是 interface 的 go 代码该怎么阅读 - V2EX
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 4481 次点击
    这是一个创建于 2992 天前的主题,其中的信息可能已经有所发展或是发生改变。
    同事写的一个比较大的功能里面,到处定义的 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 的过度包装形式了。
    looplj
        8
    looplj  
       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     Solana     1230 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 16:58 PVG 00:58 LAX 08:58 JFK 11:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86