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

应用实例

  1. 定义错误码

常规做法:

  1. package errCode
  2. type ErrCode int
  3. // 定义错误码
  4. const (
  5. ERR_CODE_OK ErrCode = 0 // OK
  6. ERR_CODE_INVALID_PARAMS = 1 // 无效参数
  7. ERR_CODE_TIMEOUT = 2 // 超时
  8. )
  9. func (e *ErrCode) String() string {
  10. switch *e {
  11. case ERR_CODE_OK:
  12. return "OK"
  13. case ERR_CODE_INVALID_PARAMS:
  14. return "无效参数"
  15. case ERR_CODE_TIMEOUT:
  16. return "超时"
  17. }
  18. return ""
  19. }
  20. =================== 调用 =====================
  21. func main() {
  22. code := errCode.ERR_CODE_INVALID_PARAMS
  23. fmt.Println(code)
  24. }
  25. 输出:
  26. 无效参数

使用go generate + stringer

  1. //go:generate stringer -type ErrCode -linecomment -output code_string.go
  2. type ErrCode int
  3. // 定义错误码
  4. const (
  5. ERR_CODE_OK ErrCode = 0 // OK
  6. ERR_CODE_INVALID_PARAMS ErrCode = 1 // 无效参数
  7. ERR_CODE_TIMEOUT ErrCode = 2 // 超时
  8. )
  9. // 执行 go generate,将会生成code_string.go文件
  10. =================== 调用 =====================
  11. func main() {
  12. code := errCode.ERR_CODE_INVALID_PARAMS
  13. fmt.Println(code)
  14. }
  15. 输出:
  16. 无效参数

参数说明
选项-type 指定stringer命令作用的类型名
选项-output 指定输出文件名
选项-linecomment 使用注释,否则使用常量名,例如ERR_CODE_INVALID_PARAMS