返回顶部
分享到

golang之 wire 库的使用介绍

Golang 来源:互联网 作者:佚名 发布时间:2025-03-02 08:28:25 人浏览
摘要

1. 写在最前面 之前 review 其他人的代码的时候,看到了关于 wire 库的使用。但当时主要是分析逻辑上的问题,没怎么太学习 wire 库的用法,刚好最近趁着提测的间隙,学习一下! 注: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):

1

2

3

4

5

6

7

8

9

10

11

12

13

// 定义了一个消息存储接口

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):

1

2

3

4

5

6

// MessageService 依赖于 Store 接口

type MessageService struct {

    store store.Store

}

// Wire Provider: 告诉 Wire 如何构造 MessageService

func NewMessageService(s store.Store) *MessageService

应用层 (main.go):

1

2

3

4

5

6

// MessageApp 依赖于 MessageService

type MessageApp struct {

    msgService *service.MessageService

}

// Wire Provider: 告诉 Wire 如何构造 MessageApp

func NewMessageApp(service *service.MessageService) *MessageApp

Wire 配置 (wire.go):

1

2

3

4

5

6

7

8

9

// 定义依赖注入的规则

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 文件,包含了正确顺序的依赖初始化代码
  • 运行时,自动按正确顺序创建和注入所有依赖

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// 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岁才当上总统,世界上每个人本来都有自己的时区,有些人看似走在你前面,有些人看似走在你后面,但其实每个人都有自己的时区和步程,不用嫉妒和嘲笑他们,每个人都在自己的时区里,你也是 。

版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Go 1.23中Timer无buffer的实现方式介绍
    在 Go 1.23 中,Timer 的实现通常是通过 time 包提供的 time.Timer 类型来实现的。Timer 是一个用于在指定时间后触发一次事件的计时器。Timer 的实
  • golang之 wire 库的使用介绍
    1. 写在最前面 之前 review 其他人的代码的时候,看到了关于 wire 库的使用。但当时主要是分析逻辑上的问题,没怎么太学习 wire 库的用法,
  • golang panic 函数用法介绍
    在 Go 语言中,panic和recover是用于处理运行时异常的关键字。以下是它们的用法总结和示例: 1. panic 的作用 触发条件:当程序遇到无法恢复
  • Go中sync.Once源码的深度介绍
    概念 sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次。它在多线程环境中非常有用,尤其是在需要初始化共享资源
  • 基于Go语言实现一个压测工具

    基于Go语言实现一个压测工具
    整体架构 整体系统架构比较简单 通用数据处理模块 Http请求响应数据处理 本项目支持http协议、websocket协议、grpc协议、Remote Authentication Di
  • golang1.23版本之前Timer Reset方法无法正确使用

    golang1.23版本之前Timer Reset方法无法正确使用
    golang1.23 之前 Reset ?到底有什么问题 在golang 的 time.Reset 文档中有这么一句话,为了防止文档更新而导致内容变动,这里粘贴出来: Before Go 1
  • 从源码解析golang Timer定时器体系
    Timer、Ticker使用及其注意事项 在刚开始学习golang语言的时候就听说Timer、Ticker的使用要尤其注意,很容易出现问题,这次就来一探究竟。 本
  • 如何修改Go结构体的私有字段
    文章正文 在 Go 语言中,结构体字段的访问权限是由字段名的首字母决定的:首字母大写表示公共字段(public),首字母小写表示私有字段(
  • Golang实现超时机制读取文件的方法
    协程与通道 协程(Goroutine)是轻量级线程,可实现函数或方法与主程序流并行执行。使用go关键字:go func(){}。通道是协程直接的通讯管道,
  • golang如何解决go get命令无响应问题

    golang如何解决go get命令无响应问题
    golang go get命令无响应问题 操作 1 go get -v github.com/golang/net 现象 go get github.com/golang/net: module github.com/golang/net: Get https://proxy.golang.org/github.co
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计