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

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

  •  
  •   Ayanokouji · 2023-02-23 12:55:42 +08:00 · 3863 次点击
    这是一个创建于 650 天前的主题,其中的信息可能已经有所发展或是发生改变。
    java 转 golang 小半年了,还是不太适应 golang 的全局变量模式。

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

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

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

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

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