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
pill_string.go ``` package painkiller import "strconv" func _() { // An "invalid array index" compiler error signifies that the constant values have changed. // Re-run the stringer command to generate them again. var x [1]struct{} _ = x[Placebo-0] _ = x[Aspirin-1] _ = x[Ibuprofen-2] _ = x[Paracetamol-3] } const _Pill_name = "PlaceboAspirinIbuprofenParacetamol" var _Pill_index = [...]uint8{0, 7, 14, 23, 34} func (i Pill) String() string { if i < 0 || i >= Pill(len(_Pill_index)-1) { return "Pill(" + strconv.FormatInt(int64(i), 10) + ")" } return _Pill_name[_Pill_index[i]:_Pill_index[i+1]] } ```

';