go generate
介绍
go generate 命令是go 1.4版本里面新添加的一个命令,当运行 go generate 时,它将扫描与当前包相关的源代码文件,找出所有包含 //go:generate 的特殊注释,提取并执行该特殊注释后面的命令,命令为可执行程序,形同shell下面执行。
有几点需要注意:
- 该特殊注释必须在
.go源码文件中。 - 每个源码文件可以包含多个
generate特殊注释时。 - 显示运行
go generate命令时,才会执行特殊注释后面的命令。 - 命令串行执行的,如果出错,就终止后面的执行。
- 特殊注释必须以
//go:generate开头,双斜线后面没有空格。
应用
在有些场景下,我们会使用 go generate :
- yacc:从 .y 文件生成 .go 文件。
- protobufs:从 protocol buffer 定义文件(.proto)生成 .pb.go 文件。
- Unicode:从 UnicodeData.txt 生成 Unicode 表。
- HTML:将 HTML 文件嵌入到 go 源码 。
- bindata:将形如 JPEG 这样的文件转成 go 代码中的字节数组。
再比如:
- string方法:为类似枚举常量这样的类型生成String()方法。
- 宏:为既定的泛型包生成特定的实现,比如用于ints的sort.Ints。
命令
go generate 命令使用格式如下:
go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
其中:
- -run 正则表达式匹配命令行,仅执行匹配的命令
- -v 输出被处理的包名和源文件名
- -n 显示不执行命令
- -x 显示并执行命令
执行 go generate 时,有一些环境变量可以使用:
$GOARCH
体系架构 (arm、amd64等待)
$GOOS
OS环境(linux、windows等)
$GOFILE
当前处理中的文件名
$GOLINE
当前命令在文件中的行号
$GOPACKAGE
当前处理文件的包名
$DOLLAR
固定的"$",不清楚用途
假设我们有个main.go文件,内容如下:
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")
}
执行 go generate 后,输出如下:
$ go generate
hello
main func
file=main.go pkg=main
示例
现在我们来实践一下前面介绍的 go generate。
String()方法
假设我们有一些代码,里面包含若干定义为Pill的整型常量:
package painkiller
type Pill int
const (
Placebo Pill = iota
Aspirin
Ibuprofen
Paracetamol
Acetaminophen = Paracetamol
)
为了调试的需要,我们会为这些常量定义String()签名方法:
func (p Pill) String() string
一般情况下,我们可能会像下面这样写:
func (p Pill) String() string {
switch p {
case Placebo:
return "Placebo"
case Aspirin:
return "Aspirin"
case Ibuprofen:
return "Ibuprofen"
case Paracetamol: // == Acetaminophen
return "Paracetamol"
}
return fmt.Sprintf("Pill(%d)", p)
}
这里,我们可以用 go generate 来实现String():
首先,我这里创建一个painkiller.go文件,包含如下内容:
//go:generate stringer -type=Pill
package painkiller
type Pill int
const (
Placebo Pill = iota
Aspirin
Ibuprofen
Paracetamol
Acetaminophen = Paracetamol
)
在文件的开头包含了一个 //go:generate stringer -type=Pill 特殊注释,其中stringer是个生成String方法的工具,为了使用stringer方法,在运行 go generate 命令前,我们需要安装stringer工具,命令如下:
$ go get golang.org/x/tools/cmd/stringer
然后,在 painkiller.go 所在的目录下面运行 go generate 命令:
$ go generate
我们会发现当前目录下面生成一个pill_string.go文件,里面实现了我们需要的String()方法,文件内容如下:
// Code generated by "stringer -type=Pill"; DO NOT EDIT.
package painkiller
import "fmt"
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 fmt.Sprintf("Pill(%d)", i)
}
return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}
go generate的更多相关文章
- 使用mvn archetype:generate生产maven工程,响应很慢
经常到下列时就不往下走了. 解决方案: 1.不使用interactive mode方式,直接指定DarchetypeArtifactId 2.仍使用interactive mode方式,但增加参数 - ...
- [LeetCode] Generate Parentheses 生成括号
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- LeetCode 22. Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- 【leetcode】Generate Parentheses
题目简述: Given n pairs of parentheses, write a function to generate all combinations of well-formed par ...
- 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目
前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...
- No.022:Generate Parentheses
问题: Given n pairs of parentheses, write a function to generate all combinations of well-formed paren ...
- iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示. 并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效. 出现以下情况: Failed to locate or generat ...
- How to generate UML Diagrams from Java code in Eclipse
UML diagrams compliment inline documentation ( javadoc ) and allow to better explore / understand a ...
- maven archetype:generate 命令简化项目模板数量
在maven里使用 mvn archetype:generate 来创建项目是十分方便的,但有时也不尽然.在网络不好时,从网络上加载 archetype-catalog.xml文件(http://re ...
- Generate Time Data(普通日期主数据)
Note: While using this option you need to replicate the standard table into SAP HANA that is T005T, ...
随机推荐
- 为什么 Llama 3.3 70B 比 GPT-4o 和 Claude 3.5 Sonnet 更优秀
过去七天的 AI 新闻如狂风暴雨般涌来,AI 世界发生了许多重大变化.在这篇文章中,我们将深入探讨来自 Llama 3.3 70B.GPT-4o 和 Claude 3.5 Sonnet 等主要参与者的 ...
- Qt编写可视化大屏电子看板系统28-模块6送检合格
一.前言 送检合格率模块包括钢件合格率.电机合格率.当天合格率.模具零件合格率四个子模块,其中钢件合格率和电极合格率都是采用的曲线图展示,统计的15天内的合格率,定位线放在90这个值的位置,相当于90 ...
- Spring+MyBatis企业应用实战(第二版)2018-电子书+源码+SQL脚本
Spring+MyBatis企业应用实战(第二版)2018学习资料: 电子书: 链接:https://pan.baidu.com/s/1yAdlA5F_HuZMbO4who5jVw 提取码:58yz ...
- Linux安装配置Go语言
Linux安装配置Go语言 官网:https://go.dev/dl/ 从官网下载,选择linux下载压缩包. sudo cp -r go/ /usr/local sudo gedit /etc/pr ...
- 今天记录一下css布局的flex布局的一个小妙招之gap
在平常前端开发中,常见的开发布局flex布局,常见的布局有这个样子,这个是可以用css进行修改,但是今天分享一个简单的方法 这种布局的话,如果是偶数的话可以用flex的 justify-content ...
- 前端之canvas实现电子签约完成线上签署功能
最近发现现在租房还是签合同,越来越多采用电子签约的方式进行,好处不用多说节约成本,节约时间.抱着好奇的心理,尝试自己动手实现一个电子签.原来并不复杂主要通过了canvas绘画能力进行实现的. 主要功能 ...
- Solution Set -「LGR-126」洛咕咕的 NOIP 模拟赛
机房在三楼, 不在五楼. 三楼确实有阶梯教室. 三楼向外望是一楼大厅屋顶所以看上去不高. 十一点前必须离开科技楼是因为爱因斯坦要锁大门. 我不会被自己写的东西清空 san 值. ...
- Solution Set -「AGC 010~012」C~F
目录 「AGC 010C」Cleaning 「AGC 010D」Decrementing 「AGC 010E」Rearranging 「AGC 010F」Tree Game ^ 「AGC 011C」S ...
- CDS标准视图:维护通知任务数据 I_MaintNotificationTaskData
视图名称:维护通知任务数据 I_MaintNotificationTaskData 视图类型:基础 视图代码:IW67/IW23 点击查看代码 @AbapCatalog.sqlViewName: 'I ...
- 引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常 解决办法
出现题目的异常,多是引用第三方控件引起的. 在NEW时,需要初始化该对象. AxESACTIVEXLib.AxESActiveX ax = new AxESACTIVEXLib.AxESActiveX ...