go generate
最后更新于:2022-04-02 02:51:34
[TOC]
## 语法
```
go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
-run 正则表达式匹配命令行,仅执行匹配的命令
-v 打印已被检索处理的文件。
-n 打印出将被执行的命令,此时将不真实执行命令
-x 打印已执行的命令
// 在执行go generate时将会加入些信息到环境变量,可在命令程序中使用
$GOARCH
架构 (arm, amd64, etc.)
$GOOS
OS (linux, windows, etc.)
$GOFILE
当前处理中的文件名
$GOLINE
当前命令在文件中的行号
$GOPACKAGE
当前处理文件的包名
$DOLLAR
固定的"$",不清楚用途
```
执行方式
```
# 打印当前目录下所有文件,将被执行的命令
go generate -n ./...
# 对包下所有Go文件进行处理
go generate github.com/ysqi/repo
# 打印包下所有文件,将被执行的命令
go generate -n runtime
```
执行 `go generate` 时候,实际是在"*.go"文件中寻找 `//go:generate `的文件并执行
### //go:generate 的文件格式
```
package main
import "fmt"
//go:generate echo hello
//go:generate go run main.go
//go:generate echo file=$GOFILE pkg=$GOPACKAGE
func main() {
fmt.Println("main func")
}
```
## 实例
### 对 Type 添加字符串
如果使用 iota 生成了常量,需要给他们添加一个 String(),接口方便打印,则可以使用 stringer
painkiller.go
```
//go:generate stringer -type=Pill
package painkiller
type Pill int
const (
Placebo Pill = iota
Aspirin
Ibuprofen
Paracetamol
Acetaminophen = Paracetamol
)
```
执行
```
> go generate ./...
```
生成文件名为 pill_string.go
';