求推荐 go 的 web 框架,要求是能实现依赖注入的相关玩法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
chogath

求推荐 go 的 web 框架,要求是能实现依赖注入的相关玩法

  •  
  •   chogath May 17, 2021 6508 views
    This topic created in 1806 days ago, the information mentioned may be changed or developed.

    类比:

    1. java 之 spring boot
    2. typescript 之 nest.js
    41 replies    2021-05-21 01:15:22 +08:00
    SingeeKing
        1
    SingeeKing  
    PRO
       May 17, 2021
    chogath
        2
    chogath  
    OP
       May 17, 2021   1
    我很多年前刚开始工作的时候,也是非常抵制依赖注入的,不就几个构造器嘛,有必要引入重量级 spring 框架么,直到后来写了一个大型系统,系统初始化的时候把一堆对象接来接去非常繁琐,经常一个构造器里会有七八个对象,而这样的构造器又有几十个,项目看上去像一坨屎,改代码像挑大粪。然后后面使用了 spring,改造后整个系统都清爽无比,才对依赖注入产生了不一样的看法。我个人理解,依赖注入这种东西只有在大型系统里用过才有体会。
    chogath
    &bsp;   3
    chogath  
    OP
       May 17, 2021
    Dogtler
        4
    Dogtler  
       May 17, 2021   1
    有趣,你又懂鼓唇弄舌,又懂战场厮杀。
    chogath
        5
    chogath  
    OP
       May 17, 2021
    @Dogtler 足下才智 与我暗合。
    eijnix
        6
    eijnix  
       May 17, 2021 via iPhone
    我们组用的是 facebook 的 inject go 还可以,不过这个项目已经停止维护了
    zjsxwc
        7
    zjsxwc  
       May 17, 2021
    golang
    依赖注入容器 https://github.com/facebookarchive/inject
    web 框架无脑 beego
    SorcererXW
        8
    SorcererXW  
       May 17, 2021
    推荐 https://github.com/google/wire , 自己写各种 provider, 然后在编译器生成整个注入链路, 不和 web 框架绑定起来, 可以使用任何 web 框架
    chogath
        9
    chogath  
    OP
       May 17, 2021
    @eijnix 感谢
    chogath
        10
    chogath  
    OP
       May 17, 2021
    @zjsxwc 好,感谢
    chogath
        11
    chogath  
    OP
       May 17, 2021
    @SorcererXW 好滴,我试下,这个玩法我还挺感兴趣的
    evilgod528
        12
    evilgod528  
       May 17, 2021
    @SorcererXW #8 推荐
    charlie21
        13
    charlie21  
       May 17, 2021 via iPhone
    前端 angular 框架那种的搞个什么东西都搞个依赖注入来降低复杂度
    dushixiang
        14
    dushixiang  
       May 17, 2021
    go 下面的依赖注入不太好用,不过由于 go 的特性,在同一个包下面的变量在不同的 go 文件里面可以互相引用,所以只需要手动初始化一次即可不限量使用。

    你可以看下我的这个项目 https://github.com/dushixiang/next-terminal
    我也是在摸索 go 的写法
    AppxLite
        15
    AppxLite  
       May 17, 2021
    echo
    chogath
        16
    chogath  
    OP
       May 17, 2021
    @FreeEx 感谢您的分享
    TuringGooner
        17
    TuringGooner  
       May 17, 2021
    手动 wire 吧,貌似没有啥特别靠谱的
    chogath
        18
    chogath  
    OP
       May 17, 2021
    @TuringGunner 好的,感谢
    king888
        19
    king888  
       May 17, 2021
    iris 自带依赖注入 https://github.com/kataras/iris/wiki/dependency-injection
    endure 也可以实现依赖注入,但是偏应用相关 https://github.com/spiral/endure
    king888
        20
    king888  
       May 17, 2021
    iris 补充一下,最近作者有些蛇王,进度更严重,只 commit 捐助名单,但是不影响使用
    endure 老毛子的东西,响应比较及时
    chogath
        21
    chogath  
    OP
       May 17, 2021
    @king888 好嘞
    king888
        22
    king888  
       May 17, 2021
    @chogath reflect 包用熟悉点,自己也可也搞个依赖注入,容器这个实现不难
    chogath
        23
    chogath  
    OP
       May 17, 2021
    @king888 是,现有的包够用了,功能都可以自己搭。但是并非是最佳实践。说白了大家也都还在探索中。。
    windyboy
        25
    windyboy  
       May 17, 2021
    善意提醒,不需要玩 go web 的时候用 spring 的思想
    zjsxwc
        26
    zjsxwc  
       May 17, 2021
    @zjsxwc
    这个依赖注入容器更简单直观,和 requirejs 一样的注入方式

    https://github.com/golobby/container
    zoharSoul
        27
    zoharSoul  
       May 17, 2021   3
    @windyboy #25 依赖注入什么时候是 spring 的思想了...
    ReferenceE
        28
    ReferenceE  
       May 17, 2021 via Android
    BeautifulSoap
        29
    BeautifulSoap  
       May 17, 2021   1
    DI 框架并不算是 spring 思维,作为减轻开发时心智负担的工具,DI 是真的挺重要的。如果真不重要的话 google 官方也不会亲自下场写 wire 这种工具了

    go 的 DI 目前用过觉得靠谱的 DI 框架有两个:

    1. wire 谷歌官方的 DI 工具。因为其他的 DI 库基本都是基于反射,性能不行,所以谷歌自己写了个这个基于代码生成的 DI,没有任何性能损失。wire 应该是目前 go 语言中关于 DI 最知名用的最广的一个工具了吧。但是问题在于,wire 是基于代码生成的,所以意味着每次你改动依赖都必须重新生成代码,虽然可以用 go generate,但还是挺麻烦的,尤其有时候你自己都不知道改了依赖,忘了生成代码程序就会出错(当然挺多错误能在编译阶段发现也算是个优点)

    2. https://github.com/uber-go/dig Uber 的基于反射的 DI 。好处自然是动态 DI,不用总生成代码,但因为基于反射,性能不行,所以 Uber 官方也建议只在 app 初始化的时候使用。目前项目里用的就是 dig,在初始化和测试的时候用 dig 做依赖注入,非常舒服
    BeautifulSoap
        30
    BeautifulSoap  
       May 17, 2021
    @BeautifulSoap 再补个 wire 的问题。因为 wire 是代码生成,所以团队开发的时候,自动生成的代码经常(是的,经常)出现 git 的代码合并冲突。我加了依赖,同事加了依赖,即便这两个依赖毫无关系也不对之前的代码有影响,生成的 wire_gen.go 也非常大的几率会合并失败。最终就是总要等一个人合并完成之后,再引入新代码,再生成一遍。真的是不厌其烦。当然一个解决办法就是彻底不提交 wire_gen.go ,每次测试或编译的时候执行 go generate 再生成临时的 wire_gen.go
    beidounanxizi
        31
    beidounanxizi  
       May 17, 2021
    JAVA 写多了 就有这个问题
    觉得 aop ioc di 很重要
    能把 JAVA 从一开始写好的人 少之又少

    既然写 go 建议多看看 go 吧
    fxjson
        32
    fxjson  
       May 18, 2021 via Android
    借楼问下各位,go log 里面添加 request id 怎么搞,包括 service 日志,gorm 日志等,不想 service,dao 层参数都加 Context 传递
    102400
        33
    102400  
       May 18, 2021
    @fxjson 中间件啊,在 Logger 中间件前面放个 SetRequestID
    chogath
        34
    chogath  
    OP
       May 18, 2021
    @fxjson 切面,interceptor 里实现
    joesonw
        35
    joesonw  
       May 18, 2021
    https://github.com/go-macaron/macaron 可以动态注入 (反射).
    joesonw
        36
    joesonw  
       May 18, 2021
    @BeautifulSoap https://github.com/uber-go/fx, 在 dig 基础上包了一层, 用起来更爽.
    x940727
        37
    x940727  
       May 18, 2021
    @beidounanxizi 这和什么语言无关,这和项目大小有关……你自己看看 kubernetes 有没有类似 spring 的容器对象?
    beidounanxizi
        38
    beidounanxizi  
       May 18, 2021
    @x940727 K8S 不太了解 不过好奇 你能给个具体例子么 ?
    x940727
        39
    x940727  
       May 18, 2021
    staging/src/k8s.io/cloud-provider/app/controllermanager.go 比如这个像不像 ServletWebServerApplicationContext?
    staging/src/k8s.io/controller-manager/app/controllercontext.go 比如这个像不像 AbstractApplicationContext ?
    beidounanxizi
        40
    beidounanxizi  
       May 21, 2021
    @x940727 AOP IOC DI 在你说额的几个 go 这里 如果体现呢?
    你觉得这些 context 或者 manager 是软件工程的角色抽象啊
    JAVA Spring 的 AOP IOC DI 不知道你理解的是什么意思?
    AOP 是面向切面编程,动态 /静态编译 , IOC 是 bean 的注入实例化和管理
    都没有用反射, 再多是 function programming
    beidounanxizi
        41
    beidounanxizi  
       May 21, 2021
    @x940727

    你不能说 applicationcontext 和 controllercontext 相似 就是相同吧

    而且 go 自带的 context 和 JAVA spring 的 context 差十万八千里
    About     Help     Advertise     Blog     API     FAQ     Solana     3309 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 66ms UTC 13:16 PVG 21:16 LAX 06:16 JFK 09:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86