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

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

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

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

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

    你先入为主了
    xmge
        34
    xmge  
       2019-01-04 10:49:52 +08:00
    @preach 是啊,肯定有价值啊,但是确实有点繁琐
    keepeye
        35
    keepeye  
       2019-01-04 10:51:40 +08:00
    不能 recycle import,导致代码组织起来很别扭
    yepinf
        36
    yepinf  
       2019-01-04 10:55:43 +08:00
    @liuyibao 感谢

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

    我这边还是用 package 组织
    byfar
        37
    byfar  
       2019-01-04 13:30:38 +08:00   ❤️ 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
    qianlifeng
        38
    qianlifeng  
       2019-01-04 13:48:41 +08:00
    目前用下来唯一不方便的是包之间不能相互引用(按照功能模块划分的时候就会出现问题),其他还好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1594 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:59 · PVG 00:59 · LAX 08:59 · JFK 11:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.