• 请不要在回答技术问题时复制粘贴 AI 生成的内容
preach
V2EX  ›  程序员

go 现阶段工程化是不是还有点坑?

  •  
  •   preach ·
    guider · Jan 4, 2019 · 7208 views
    This topic created in 2866 days ago, the information mentioned may be changed or developed.
    习惯了 Java 的规整之后,把 PHP 也当成 Java 规整的去写,对于 Python 以及 go 这两种语言尝试过很多次不知道如何能想 Java 那样去组织代码结构。今天又看了很多例子,凌晨两点 毫无头绪 不是不会写,就是这种文件结构很难受,感觉这种代码组织方式项目大了应该会很坑吧? 我当然知道有很多成熟的项目 docker 之类的 但是我目前就是感觉有点难受,不知道有类似经历的 v 友。
    Supplement 1  ·  Jan 4, 2019
    再次强调一下,我只是对 go 的文件组织有疑问。语法之类的没有疑问。谢谢热心回答的 v 友
    38 replies  •  2019-01-04 13:48:41 +08:00
    mxtob
    mxtob
    Jan 4, 2019 via iPhone
    1
    go 写起来,有点像写 js 感觉。在熟悉别人的包时,跳到代码定义处,没有像 php 整个 class 看起来容易理解,个人也是初学 go.
    preach
    preach
    OP
    Jan 4, 2019
    2
    @mxtob 我是习惯了 namespace 包括在写 PHP 的时候也是强制 namespace 与 js 不同的是 js 不会出现特别大量的 js 代码 基本上一个 template 3 个文件以内 就目前来说 Python 和 go 去写后台大量的代码 我是不知道怎么组织 。
    abcbuzhiming
    abcbuzhiming
    Jan 4, 2019
    3
    1.不要过度工程化
    2.php 不适合像 Java 那样整,PHP 和 python 这类语言的真正的问题在于没有类型限定符,代码很容易腐化。工程化也解决不了这个问题,开发的参与者越多这个问题越明显
    ericgui
    ericgui
    Jan 4, 2019
    4
    就是啊,问个问题,js 啥时候会上 namespace
    orangeade
    orangeade
    Jan 4, 2019 via Android
    5
    不是有 go mod 了嘛,拆成一个个模块就行
    KgM4gLtF0shViDH3
    KgM4gLtF0shViDH3
    Jan 4, 2019 via iPhone
    6
    如果要像 Java PHP 那样你可以看 beego😏
    janxin
    janxin
    Jan 4, 2019
    7
    学语言最难受的莫过于拿其他语言的模式去套在新语言身上:你会发现卧槽这个怎么没有,那个怎么不行?

    写 Java 最重要的是思路的转换,比如 DDD、DI 等等套在 Go 上面也不是不行的,只是思路要转换一下,代码不是一定要像 Java 一样写,最重要的是不要一定要拿着设计模式去套。毕竟设计模式就是对着 Java 设计的,其他语言用起来不像 Java 的代码组织一样。举个最明显的例子,生产者消费者模式用 channel 实现就跟 Java 里面完全不同,明显要简单很多。
    lihongjie0209
    lihongjie0209
    Jan 4, 2019
    8
    @janxin 设计模式什么时候和语言绑定了?
    zjsxwc
    zjsxwc
    Jan 4, 2019
    9
    我写 go 都是按文件来组织代码的,很多一个.go 文件只有一两个函数
    reus
    reus
    Jan 4, 2019
    10
    别人行,你不行,那就是你自己的问题,不是语言的问题
    jjx
    jjx
    Jan 4, 2019
    11
    java 以包类组织代码, 包很深, 类因为有 dao , dto, model, di 等机制, 每个类的代码都会得到控制

    go 语言就比较另类了, 如果用 struct 代替类去组织代码, 一则 go 不搞 java 那套, 二则 go 代码模板代码太多, 啰嗦,一个 struct 几个业务逻辑下来, 代码行太长, 就会很难维护

    所以, 很多用 go 写实际业务的(其实我觉得很多吹 go 比 python 好的,基本上都是写转发类的,业务相对简单,性能要求相对高的代码的, 而不是用 go 写实际业务的) , 只能用方法去组织文件


    用方法去组织文件也有很多方法, 典型的可以按 rpc 风格去组织,比方说, 新按业务逻辑分包, 然后将类似 taobao.user.seller.get, taobao.user.buyer.get 等方法一个方法一文件(看代码量, 几行的也可以放在一起), 如

    user
    user_seller_get.go
    user_buyer_get.go


    另外要吐槽的一点是, go 虽然说是互联网的 c, 要取代 c++, 比 python 更好, 但命名确实 java 的驼峰, 用惯了 python,c 的对上面的这些命名用驼峰我是很不习惯, 我是不管这些的
    mosliu
    mosliu
    Jan 4, 2019
    12
    一个 struct 及相应方法对应一个文件就好啦。
    相应的功能一个文件夹组成一个模块。
    sagaxu
    sagaxu
    Jan 4, 2019 via Android
    13
    @janxin 第一本设计模式的书,不是 gof 用 c++描述的吗? channel 跟 queue 有多少不同?感觉写出来差不多啊。
    eternaldzw
    eternaldzw
    Jan 4, 2019
    14
    @ericgui 用个 typescript
    sujin190
    sujin190
    Jan 4, 2019
    15
    go 就是 go,php 和 python 各有特性,为啥非要像 java
    而且真实烦 java 那啰嗦劲不行了
    liuyibao
    liuyibao
    Jan 4, 2019
    16
    Golang 在 SmartX 实践
    https://cloud.tencent.com/developer/news/267238

    我也有这种感觉,这篇文章可以参考一下。
    specita
    specita
    Jan 4, 2019
    17
    用 java 的思维去写 go,肯定很别扭的,当初我一开始写 go 就是这种感觉
    preach
    preach
    OP
    Jan 4, 2019 via iPhone
    18
    @janxin 我只想代码有个好的结构,我受不了一个目录里有几十个文件
    darkcode
    darkcode
    Jan 4, 2019
    19
    好像只有 Java 会那样规整的去写吧,没见过用其他语言的还那样套路化的写
    preach
    preach
    OP
    Jan 4, 2019
    20
    @darkcode php 有了 namespace 也可以的
    xmge
    xmge
    Jan 4, 2019
    21
    从 java 转 go,再让我写程序,我绝壁不用 java
    preach
    preach
    OP
    Jan 4, 2019
    22
    @jjx 我之前也是用 go 谢了一些服务 没有关系到业务,代码量较少。 这次有时间想试试转点业务过去,但是这个代码组织方案有点尴尬
    preach
    preach
    OP
    Jan 4, 2019
    23
    @bestkayle 好嘞 谢谢
    preach
    preach
    OP
    Jan 4, 2019
    24
    @xmge 233 我觉得 Java 还是有价值的
    preach
    preach
    OP
    Jan 4, 2019
    25
    @liuyibao 去看看 谢老哥
    clino
    clino
    Jan 4, 2019
    26
    @preach go 开发里源代码不能放在子目录吗?我找了些 go 源码不是这样的吧...
    preach
    preach
    OP
    Jan 4, 2019
    27
    @liuyibao
    https://cloud.tencent.com/developer/news/267238 推荐的这个文章很有参考价值 谢谢
    preach
    preach
    OP
    Jan 4, 2019
    28
    @clino 可以的 代码 组织不是这个意思 你去看看 gin 的源码组织结构
    iamsee
    iamsee
    Jan 4, 2019
    29
    go mod
    clino
    clino
    Jan 4, 2019
    30
    @preach 我是问你前面说的"我受不了一个目录里有几十个文件",go 里面就得这样吗?
    preach
    preach
    OP
    Jan 4, 2019
    31
    @clino 233
    preach
    preach
    OP
    Jan 4, 2019
    32
    @clino 我的描述有问题 我想问的还是工程化问题
    zhengxiaowai
    zhengxiaowai
    Jan 4, 2019
    33
    请不要把一个语言的惯性思维带到另一个语言,这样没有意义,每种语言都有自己最佳实践。

    你先入为主了
    xmge
    xmge
    Jan 4, 2019
    34
    @preach 是啊,肯定有价值啊,但是确实有点繁琐
    keepeye
    keepeye
    Jan 4, 2019
    35
    不能 recycle import,导致代码组织起来很别扭
    yepinf
    yepinf
    Jan 4, 2019
    36
    @liuyibao 感谢

    `较好的组织方式:按依赖划分`
    也没看出来哪来更好??

    我这边还是用 package 组织
    byfar
    byfar
    Jan 4, 2019❤️1
    37
    我看 gopher 说得都比较少,那就由我献献丑吧。

    如果有兴趣的话,可以看看 go 的标准库。一个语言的标准库可以说明一个语言的使用习惯与组织语言的方式的,至少我是这么认为的。

    引:"我受不了一个目录里有几十个文件"

    一个文件夹(package) 下的所有 .go 文件其实可以全部写在一个文件的,我觉得并不会有什么差异。

    但为何要分开?比如标准库 net 包,也有几十个文件,不过这每个文件名都可以很好的描述本文件所写的内容,对于查看代码会有更好的辅助,浏览一下整个包的文件列表,可以大致了解这个包提供的功能。

    一般我认为一个包会提供若干个方法来实现一个共同的功能,如果一个包提供了多个不相干的功能,那是否需要考虑拆分一下,让项目结构更友好。

    标准库也有像 strings、sort、path、sync 这样的包,文件没有几个,却让你一看名字就知道是什么样的功能。当然还有常用的 fmt 包。

    如果你认同标准库的组织方式,并从中吸取了组织的方式,那你写起 go 来也神清气爽。

    如果你不认同标准库的组织方式,那我说再多我自己写 go 的方式也木有用了。

    最后给个选修链接, 业界大佬写的,有些兴趣的朋友可以阅读一下,受益匪浅。
    《 Practical Go: Real world advice for writing maintainable Go programs 》: https://dave.cheney.net/practical-go/presentations/qcon-china.html
    qianlifeng
    qianlifeng
    Jan 4, 2019
    38
    目前用下来唯一不方便的是包之间不能相互引用(按照功能模块划分的时候就会出现问题),其他还好。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2065 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 14:51 · PVG 22:51 · LAX 06:51 · JFK 09:51
    ♥ Do have faith in what you're doing.