golang 之 wire 库的使用小结

 更新时间:2025年03月01日 10:25:57   作者:phantom_111  
Wire是一个用于Go语言的编译时依赖注入库,通过代码生成提高性能和可维护性,它支持编译时依赖注入、类型安全、简单易用等功能,文章通过代码示例展示了如何使用Wire进行依赖注入,并探讨了其优点如解耦、可测试和维护性,感兴趣的朋友跟随小编一起看看吧

1. 写在最前面

之前 review 其他人的代码的时候,看到了关于 wire 库的使用。但当时主要是分析逻辑上的问题,没怎么太学习 wire 库的用法,刚好最近趁着提测的间隙,学习一下!

注:wire 库 github.com/google/wire/cmd/wire 是 Google 开发的一个用于依赖注入的 Go 语言库。Wire 采用了编译时依赖注入的方式,旨在减少运行时开销,提高应用程序的性能和可维护性。

2. 介绍

2.1 特点介绍

编译时依赖注入:Wire 在编译时解析依赖关系,生成代码以满足依赖。这意味着在运行时没有反射或其他开销,从而提高了性能。

类型安全:Wire 利用 Go 的类型系统,确保依赖关系的正确性。这可以在编译时捕获错误,而不是在运行时。

简单易用:Wire 的 API 设计简单,易于理解和使用。通过明确的配置,可以轻松管理复杂的依赖关系。

生成代码:Wire 使用代码生成的方式创建所需的构造函数和初始化代码。用户只需定义依赖关系,Wire 会自动生成满足这些依赖的代码。

2.2 使用函数解释

  • wire.NewSet 允许你组合多个提供者函数,组织依赖关系。
  • wire.Build 用于定义 Injector 的构建逻辑,自动生成满足依赖关系的代码。

3. 代码示例

存储层 (store/store.go):

// 定义了一个消息存储接口
type Store interface {
    Save(msg Message) error
    Get() (Message, error)
}
// ProvideStore 将 InMemoryStore 绑定到 Store 接口
func ProvideStore() Store {
    return NewInMemoryStore()
}
// StoreSet 是 Wire 的 provider set
var StoreSet = wire.NewSet(
    ProvideStore,
)

服务层 (service/service.go):

// MessageService 依赖于 Store 接口
type MessageService struct {
    store store.Store
}
// Wire Provider: 告诉 Wire 如何构造 MessageService
func NewMessageService(s store.Store) *MessageService

应用层 (main.go):

// MessageApp 依赖于 MessageService
type MessageApp struct {
    msgService *service.MessageService
}
// Wire Provider: 告诉 Wire 如何构造 MessageApp
func NewMessageApp(service *service.MessageService) *MessageApp

Wire 配置 (wire.go):

// 定义依赖注入的规则
func InitializeMessageApp() (*MessageApp, error) {
    wire.Build(
        store.StoreSet,             // 提供 Store 接口的实现
        service.NewMessageService,  // 提供 MessageService 的构造函数
        NewMessageApp,              // 提供 MessageApp 的构造函数
    )
    return &MessageApp{}, nil       // 这个返回值会被 Wire 生成的代码替换
}

依赖关系:

  • MessageApp 依赖 → MessageService
  • MessageService 依赖 → Store 接口
  • Store 接口由 InMemoryStore 实现

Wire 的工作流程:

  • 分析 wire.go 中的 InitializeMessageApp 函数
  • 检查所有依赖关系
  • 生成 wire_gen.go 文件,包含了正确顺序的依赖初始化代码
  • 运行时,自动按正确顺序创建和注入所有依赖
// Code generated by Wire. DO NOT EDIT.
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
import (
    "example/wire/service"
    "example/wire/store"
)
// Injectors from wire.go:
// InitializeMessageApp 使用 Wire 来注入依赖并初始化应用
func InitializeMessageApp() (*MessageApp, error) {
    storeStore := store.ProvideStore()
    messageService := service.NewMessageService(storeStore)
    messageApp := NewMessageApp(messageService)
    return messageApp, nil
}

这种依赖注入方式的优点:

  • 解耦:各组件之间通过接口交互,不直接依赖具体实现
  • 可测试:易于替换模拟实现进行测试
  • 维护性:依赖关系清晰,容易管理
  • 编译时检查:在编译时就能发现依赖配置问题

4. 碎碎念

之前一阵子焦虑 AI 是不是会替代自己,但是换个角度想,如果能更充分的利用 AI,是不是之前消耗的很多时间都可以节省掉,这样就可以做很多有意义的事情啦:

  • 她那个时候还太年轻,不知道所有命运馈赠的礼物,都早已在背后标好了价格。
  • 不要责怪以前的自己, 她那时一个人站在雾里也很迷茫。
  • 纽约的时间比加州时间早3个小时,但加州并没变慢,奥巴马55岁就退休了,但川普70岁才当上总统,世界上每个人本来都有自己的时区,有些人看似走在你前面,有些人看似走在你后面,但其实每个人都有自己的时区和步程,不用嫉妒和嘲笑他们,每个人都在自己的时区里,你也是 。

5. 参考资料

到此这篇关于golang 之 wire 库的使用总结的文章就介绍到这了,更多相关golang wire 库使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go手写数据库ZiyiDB的实现

    Go手写数据库ZiyiDB的实现

    本文主要介绍了Go手写数据库ZiyiDB的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • Go语言的接口详解

    Go语言的接口详解

    这篇文章主要介绍了go语言的接口,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能够给你带来帮助
    2021-10-10
  • 使用Go语言实现HTTP客户端请求并解析响应的完整流程

    使用Go语言实现HTTP客户端请求并解析响应的完整流程

    在日常开发中,无论是调用 RESTful API、采集网页数据,还是进行微服务之间的通信,HTTP 客户端几乎无处不在,本文聚焦于如何使用 Go 实现一个 HTTP 客户端,完成请求发送、响应解析、错误处理、Header与Body提取等完整流程,需要的朋友可以参考下
    2025-08-08
  • go-zero接入skywalking实现链路追踪的详细教程

    go-zero接入skywalking实现链路追踪的详细教程

    SkyWalking是一个开源的服务追踪系统,它专注于分布式系统的可观测性和服务性能分析,它的主要目标是帮助开发者理解和优化微服务架构中的服务间交互情况,本文介绍了go-zero接入skywalking链路追踪的详细教程,需要的朋友可以参考下
    2024-08-08
  • Go语言实现读取文件的方式总结

    Go语言实现读取文件的方式总结

    这篇文章主要为大家详细介绍了Go语言实现读取文件的几个方式,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,感兴趣的小伙伴可以收藏一下
    2023-04-04
  • 图文详解Go程序如何编译并运行起来的

    图文详解Go程序如何编译并运行起来的

    Go语言这两年在语言排行榜上的上升势头非常猛,Go语言虽然是静态编译型语言,但是它却拥有脚本化的语法,下面这篇文章主要给大家介绍了关于Go程序如何编译并运行起来的相关资料,需要的朋友可以参考下
    2024-05-05
  • Go语言TCP从原理到代码实现详解

    Go语言TCP从原理到代码实现详解

    这篇文章主要为大家介绍了Go语言TCP从原理到代码实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go操作各大消息队列教程(RabbitMQ、Kafka)

    Go操作各大消息队列教程(RabbitMQ、Kafka)

    消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构,本文主要介绍了Go操作各大消息队列教程(RabbitMQ、Kafka),需要的朋友可以了解一下
    2024-02-02
  • Golang报“import cycle not allowed”错误的2种解决方法

    Golang报“import cycle not allowed”错误的2种解决方法

    这篇文章主要给大家介绍了关于Golang报"import cycle not allowed"错误的2种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以们下面随着小编来一起看看吧
    2018-08-08
  • 一文详解Go语言中的有限状态机FSM

    一文详解Go语言中的有限状态机FSM

    有限状态机(Finite State Machine,FSM)是一种数学模型,用于描述系统在不同状态下的行为和转移条件。本文主要来和大家简单讲讲Go语言中的有限状态机FSM的使用,需要的可以参考一下
    2023-04-04

最新评论