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

全局变量 vs 依赖注入,你更喜欢哪一个

  •  
  •   Ayanokouji · Feb 23, 2023 · 4959 views
    This topic created in 1182 days ago, the information mentioned may be changed or developed.
    java 转 golang 小半年了,还是不太适应 golang 的全局变量模式。

    我知道 golang 也有 google wire 和 uber fx 这样的框架,但是所在项目并没有使用。

    这里不是引战,只希望各位讨论下,这两种方式的优缺点和个人喜好。
    18 replies    2023-02-23 16:41:01 +08:00
    Mohanson
        1
    Mohanson  
       Feb 23, 2023 via Android
    看我头像然后猜猜答案
    chaleaochexist
        2
    chaleaochexist  
       Feb 23, 2023
    可以通过别的方式实现 IOC 不一定非得依赖注入.
    Ayanokouji
        3
    Ayanokouji  
    OP
       Feb 23, 2023
    @Mohanson golang 新人,猜不到
    aristotll
        4
    aristotll  
       Feb 23, 2023
    > 所在项目并没有使用

    只能说明所在项目不需要这个复杂性 或者水平比较低
    Ayanokouji
        5
    Ayanokouji  
    OP
       Feb 23, 2023
    @aristotll 但是还是会使用很多中间件,使用的是全局初始化的方式管理中间件的客户端
    jeesk
        6
    jeesk  
       Feb 23, 2023
    看领导的
    kongkongye
        7
    kongkongye  
       Feb 23, 2023
    有个依赖循环的蛋疼问题
    Ayanokouji
        8
    Ayanokouji  
    OP
       Feb 23, 2023
    @kongkongye 这确实是一个缺点
    showshowcode
        9
    showshowcode  
       Feb 23, 2023
    我没用过别的 不过我们用的 fx
    luob
        10
    luob  
       Feb 23, 2023
    match (单元测试, 参与人数) {
    | (false, _) => 全局变量
    | (true, n) when n < 10 => 手动依赖注入
    | (true, _) => 自动依赖注入
    }
    coderxy
        11
    coderxy  
       Feb 23, 2023
    不要全局变量也不要依赖注入, 做好变量作用域规范就好了。 全局变量跟依赖注入都是大坑。
    JamesMackerel
        12
    JamesMackerel  
       Feb 23, 2023
    前段时间自己写的项目试了一下 wire ,感觉还可以。我自己是 Java Go 都做的,不过最近 Java 做得更多。

    全局变量的这个模式,最烦人的一点就是单元测试很难搞。很难 mock 。但是依赖注入这个就是说会多一些黑盒步骤,出问题的概率会多一点(不过可能手动依赖注入出问题的概率还要大点?)。

    说到这里,我又想说一下 beego 的那个 router 的设计。他的 controller 传进去只是拿来做一个识别类型的作用,最后 beego 会根据这个类型,再根据字符串里的函数名,用反射重新创建对象然后搞一遍……完全杜绝了你搞依赖注入那一套。
    biubiuF
        13
    biubiuF  
       Feb 23, 2023 via Android
    @Ayanokouji 他头像就是 golang 的 logo
    Ayanokouji
        14
    Ayanokouji  
    OP
       Feb 23, 2023
    @biubiuF 还是不明白能猜出啥来
    billlee
        15
    billlee  
       Feb 23, 2023 via Android
    依赖注入。而且大部分情况根本不需要框架,手工 wire 就足够了。
    JamesMackerel
        16
    JamesMackerel  
       Feb 23, 2023
    @Ayanokouji 一般写 go 的人都很讨厌 Java 那一套依赖注入之类的操作。
    xiaocaiji111
        17
    xiaocaiji111  
       Feb 23, 2023
    依赖注入我觉得大项目是必须的,不然全局变量满天飞,很难管理,谁知道啥时候给谁改成了啥。
    目前 java 写的多,go 也接触不少年了,go 项目基本使用 wire 做静态注入,简单的就手动组合。像 dig 那种基本无感。
    Nazz
        18
    Nazz  
       Feb 23, 2023
    推荐私有全局变量, 包内进行相关操作, 尽量可控
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5210 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 07:52 · PVG 15:52 · LAX 00:52 · JFK 03:52
    ♥ Do have faith in what you're doing.