go generate
go generate是 Go 自带的工具。使用命令go generate执行。go generate是利用源代码中的注释工作的。格式如下:
//go:generate command arg1 arg2
这样在同一个目录下执行命令go generate就会自动运行命令command arg1 arg2。command可以是在PATH中的任何命令,应用非常广泛。官网提供了几种示例,见文档。
go generate命令
- -run 正则表达式匹配命令行,仅执行匹配的命令
- -v 输出被处理的包名和源文件名
- -n 显示不执行命令
- -x 显示并执行命令
$GOARCH 体系架构 (arm、amd64等待)
$GOOS OS环境(linux、windows等)
$GOFILE 当前处理中的文件名
$GOLINE 当前命令在文件中的行号
$GOPACKAGE 当前处理文件的包名
$DOLLAR 固定的”$”,不清楚用途
Stringer
stringer命令可以为给定类型生成String方法。
go get golang.org/x/tools/cmd/stringer
应用实例
- 定义错误码
常规做法:
package errCode
type ErrCode int
// 定义错误码
const (
ERR_CODE_OK ErrCode = 0 // OK
ERR_CODE_INVALID_PARAMS = 1 // 无效参数
ERR_CODE_TIMEOUT = 2 // 超时
)
func (e *ErrCode) String() string {
switch *e {
case ERR_CODE_OK:
return "OK"
case ERR_CODE_INVALID_PARAMS:
return "无效参数"
case ERR_CODE_TIMEOUT:
return "超时"
}
return ""
}
=================== 调用 =====================
func main() {
code := errCode.ERR_CODE_INVALID_PARAMS
fmt.Println(code)
}
输出:
无效参数
使用go generate + stringer
//go:generate stringer -type ErrCode -linecomment -output code_string.go
type ErrCode int
// 定义错误码
const (
ERR_CODE_OK ErrCode = 0 // OK
ERR_CODE_INVALID_PARAMS ErrCode = 1 // 无效参数
ERR_CODE_TIMEOUT ErrCode = 2 // 超时
)
// 执行 go generate,将会生成code_string.go文件
=================== 调用 =====================
func main() {
code := errCode.ERR_CODE_INVALID_PARAMS
fmt.Println(code)
}
输出:
无效参数
参数说明
选项-type 指定stringer命令作用的类型名
选项-output 指定输出文件名
选项-linecomment 使用注释,否则使用常量名,例如ERR_CODE_INVALID_PARAMS