google/wire This repository was archived by the owner on Aug 7, 2025. It is now read-only. - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ippolito
V2EX    Go 编程语言

google/wire This repository was arcived by the owner on Aug 7, 2025. It is now read-only.

  •  
  •   ippolito 63 天前 1917 次点击
    这是一个创建于 63 天前的主题,其中的信息可能已经有所发展或是发生改变。
    8 条回复    2025-08-10 19:43:13 +08:00
    MIUIOS
        1
    MIUIOS  
       63 天前
    谷歌日常操作
    apkapb
        2
    apkapb  
       63 天前
    反正上次更新也是去年了。。。。
    Rehtt
        3
    Rehtt  
       63 天前 via Android
    不过也很久没更新了,最新版本还是 2024 年发的,现在 25 年都过了大半了
    skiy
        4
    skiy  
       62 天前
    之前想用的说,后来看到很长时间没更新了。最后老实用传统方式。
    sampeng
        5
    sampeng  
       62 天前 via iPhone
    也没啥好更新的啊…就是个生成工具…也完全够用啊。只是懒得加新功能了吧
    DefoliationM
        6
    DefoliationM  
       62 天前
    现在都 vibe coding 了,确实可有可无了,而且真没觉得啥地方需要用依赖注入的。
    doraemonki
        7
    doraemonki  
       62 天前
    看来 Go 不太适合搞依赖注入
    kuanat
        8
    kuanat  
       61 天前
    我之前在关于 go 的一些帖子里提到过一个观点,因为 go 的依赖注入太普遍,也太简单了,所以 go 的依赖注入“框架”是非常不流行的。而 google/wire 也不是其他语言一般意义上的依赖注入框架,更准确地说它是自动生成初始化代码的框架,解决的是自动化的需求问题,而非解决注入依赖的问题。还有一个原因是,go 语言提倡显式控制流,所以类似 try...catch 的跳转机制,包括基于中心注册的注入依赖框架(通过运行时反射匹配),都不容易被 go 社区接受。

    造成这种现象的更深层的原因,我认为在于 go 对于面向对象的抽象有两个重要的思想转变,一个是接口由需求方定义,另一个是用组合代替继承。前者就是所谓的 duck typing ,实现接口并不需要显式声明,后者是 struct embedding/receiver method ,两者结合,go 可以用极其简单的方式实现 mock 功能以及对第三方代码的复用。

    作为对比,Java/C# 在设计思想上还停留在供给方定义接口的层面上,而需求方通常又不会主动 fork 修改供给方的代码,所以要“实现”一个接口,往往是通过所谓的适配器 Adapter 模式。相比于 struct embedding ,这种适配器模式尽管达到了在不修改第三方代码的前提下“实现”接口的目的,但它要求适配器要持有原始类的实例对象。

    如果是 1:1 的接口转换,这种模式还勉强够用,如果是比较复杂的接口转换场景,receiver method 的优势就体现出来了,既可以对自定义的结构增加实例方法,也可以通过别名对第三方或者内置类型添加方法。C# 为此增加了 Extension Methods ,使得它能做到和 go 一样的效果。但是 Java 是没有办法在不修改代码的前提下,为已有类型添加方法的。

    所以你会看到 Java 生态中,大部分的供应者在编写代码时,会首先编写接口,毕竟测试与 Mock 场景极其依赖接口。同时适配器模式不是复用数据结构,而是间接持有实例,所以会导致需要管理(相对于 go )更多的对象实例。于是,很多大型项目会直接使用 mocking 框架来简化对于大量实例的管理。由此可以看出,go 多数时间是只需要管理自己编写的(或者封装的)实例的,这极大简化了开发者的心智负担,也减少了对使用工具管理实例的需求。

    这种对于大量对象的管理需求,才是依赖注入框架的意义所在。对于实例的管理,除了初始化构造,还包括生命周期。现在无论让谁来设计一套通用的依赖注入框架,它对于对象实例本身的管理一定是全局的,也就有了所谓的 DI 容器,另一方面它对于对象实例声明周期的管理一定是隐式的,开发者可以声明 transient/scoped/singleton 之类的意图,但框架并不允许开发者自己手动管理。

    回到 go 的生态来看,一方面既没有管理那么多对象实例的需求,另一方面也不提倡隐式控制流,加上 go 生态中显式传递 context 是事实上的标准,所以 DI 的存在空间就非常小了。如果非要在 go 中实现依赖注入,就好比手持锤子看什么都是钉子,解决一个不存在的问题。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3006 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 19ms UTC 12:05 PVG 20:05 LAX 05:05 JFK 08:05
    Do have faith in what you're doing.
    ubao 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