# wire-demo **Repository Path**: llh-gitee/wire-demo ## Basic Information - **Project Name**: wire-demo - **Description**: 学习wire框架的测试代码。注释齐全,测试案例齐全。 - **Primary Language**: Go - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2020-09-07 - **Last Updated**: 2024-01-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 学习wire框架的测试代码。注释齐全,测试案例齐全。 [源码](https://gitee.com/llh-gitee/wire-demo)结构说明 ``` ├─demo1 基本用法 ├─demo2 接口绑定 ├─demo3 结构体值注入 └─demo4 对错误的处理 ``` # 使用说明 安装wire命令 ```go go get github.com/google/wire/cmd/wire ``` 这个只需要安装一次就可以了,没必要为每个项目都安装一次。 ## 基本概念 `provider`和`injector`是`wire`的两个核心概念。 1. `provider`是普通的go函数,用它来产生指定对象的。因而这类函数必须是有返回值的。 2. `injector`是组织`provider`函数按依赖顺序(不是参数传入顺序)生成对象的。此函数的最终目标是生成指定对象,因而必须要有返回值。但它的返回值是在代码生成时确定,编写`injector`函数时返回值可以任意指定。(参考各demo下的`wire.go`文件) # 使用步骤 wire的使用大体上可以分为以下几步。 ## 1 编写初始化函数 例: ```go // NewMessage 创建打招呼内容 func NewMessage() Message { return Message("Hi there!") } ``` 此函数初始化了一个`Message`结构体。这个函数的结果会作为下个函数的输入。如果初始化函数与的输入与输出与其他初始化函数都没关系,那么wire代码生成失败。 此类函数被称为`provider`。 ## 2 组织初始化函数流程 例: ```go // InitGreeteEvent1 使用 wire 生成初始化代码 func InitGreeteEvent1() Event { wire.Build(NewEvent, NewGreeter, NewMessage) return Event{} // 这里的返回值不重要。 } ``` 此函数是组织一系列相关初始化函数的,并传入`wire.Build`函数内进行代码生成。 这种函数被称为`injector`。 这里有几点需要注意: 1. `injector`函数需要写在`wire.go`文件内。虽然文件名并非强制使用这个,但wire工具生成的文件名固定为`wire_gen.go`,不想每次都改文件名就用这个吧。 2. `wire.go`文件必须加入`//+build wireinject`注释,且它与`package xxx`语句之间至少有一个空行。 ## 3 生成代码 这里倒没什么好说的,命令行到指定目录下执行`wire`命令就可以了。 官网上的例子都是在`main`包下,别太死板,这个命令是可以到处执行的。