Golang
主页 > 脚本 > Golang >

golang之 wire 库的使用介绍

2025-03-02 | 佚名 | 点击:

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 使用函数解释

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 生成的代码替换

}

依赖关系:

Wire 的工作流程:

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,是不是之前消耗的很多时间都可以节省掉,这样就可以做很多有意义的事情啦:

原文链接:
相关文章
最新更新