首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

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

    写 Java 最重要的是思路的转换,比如 DDD、DI 等等套在 Go 上面也不是不行的,只是思路要转换一下,代码不是一定要像 Java 一样写,最重要的是不要一定要拿着设计模式去套。毕竟设计模式就是对着 Java 设计的,其他语言用起来不像 Java 的代码组织一样。举个最明显的例子,生产者消费者模式用 channel 实现就跟 Java 里面完全不同,明显要简单很多。
        8
    lihongjie0209   231 天前
    @janxin 设计模式什么时候和语言绑定了?
        9
    zjsxwc   231 天前
    我写 go 都是按文件来组织代码的,很多一个.go 文件只有一两个函数
        10
    reus   231 天前
    别人行,你不行,那就是你自己的问题,不是语言的问题
        11
    jjx   231 天前
    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 的对上面的这些命名用驼峰我是很不习惯, 我是不管这些的
        12
    mosliu   230 天前
    一个 struct 及相应方法对应一个文件就好啦。
    相应的功能一个文件夹组成一个模块。
        13
    sagaxu   230 天前 via Android
    @janxin 第一本设计模式的书,不是 gof 用 c++描述的吗? channel 跟 queue 有多少不同?感觉写出来差不多啊。
        14
    eternaldzw   230 天前
    @ericgui 用个 typescript
        15
    sujin190   230 天前
    go 就是 go,php 和 python 各有特性,为啥非要像 java
    而且真实烦 java 那啰嗦劲不行了
        16
    liuyibao   230 天前
    Golang 在 SmartX 实践
    https://cloud.tencent.com/developer/news/267238

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

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

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

    我这边还是用 package 组织
        37
    byfar   230 天前   ♥ 1
    我看 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
        38
    qianlifeng   230 天前
    目前用下来唯一不方便的是包之间不能相互引用(按照功能模块划分的时候就会出现问题),其他还好。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3533 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 01:10 · PVG 09:10 · LAX 18:10 · JFK 21:10
    ♥ Do have faith in what you're doing.