我的编程空间,编程开发者的网络收藏夹
学习永远不晚

go generate命令怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

go generate命令怎么使用

本篇内容介绍了“go generate命令怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

“go generate”命令的作用是在编译前自动化生成某类代码;它常用于自动生成代码,它可以在代码编译之前根据源代码生成代码。当运行“go generate”命令时,它将扫描与当前包相关的源代码文件,找出所有包含“//go:generate”的特殊注释,提取并执行该特殊注释后面的命令。

Go语言提供了一系列强大的工具,灵活使用这些工具,能够让我们的项目开发更加容易,工具集包含如下。

bug         start a bug reportbuild       compile packages and dependenciesclean       remove object files and cached filesdoc         show documentation for package or symbolenv         print Go environment informationfix         update packages to use new APIsfmt         gofmt (reformat) package sourcesgenerate    generate Go files by processing sourceget         add dependencies to current module and install theminstall     compile and install packages and dependencieslist        list packages or modulesmod         module maintenancerun         compile and run Go programtest        test packagestool        run specified go toolversion     print Go versionvet         report likely mistakes in packages

工具的源码位于$GOPATH/class="lazy" data-src/cmd/internal,本篇文章主要讨论Go工具generate。

go语言自动化工具

go generate命令是在Go语言 1.4 版本里面新添加的一个命令,常用于自动生成代码,它可以在代码编译之前根据源代码生成代码。当运行go generate时,它将扫描与当前包相关的源代码文件,找出所有包含"// go:generate"的注释语句,提取并执行该注释后的命令,命令为可执行程序。该过程类似于调用执行shell脚本。

使用方法

  • 添加特殊注释

//go:generate command argument...

  • 执行generate命令

$ go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]

注意事项

  • 该特殊注释必须包含在.go源码文件中。

  • 每个源码文件可以包含多个generate特殊注释。

  • go generate不会被类似go build,go get,go test等命令触发执行,必须由开发者显式使用。

  • 命令执行是串行的,如果出错,后续命令不再执行。

  • 特殊注释必须以“//go:generate”开头,双斜线之后没有空格。

  • 执行命令必须是系统PATH(echo $PATH)下的可执行程序。

使用示例

package mainimport "fmt"//go:generate echo GoGoGo!//go:generate go run main.go//go:generate echo $GOARCH $GOOS $GOFILE $GOLINE $GOPACKAGEfunc main() { fmt.Println("go rum main.go!")}

执行go generate命令

$ go generateGoGoGo!go rum main.go!amd64 darwin main.go 7 main

为枚举常量实现String方法

看完上述generate的简单介绍,可能读者并没有感受到该工具的强大之处,小菜刀提供一个该工具的经典应用场景:为枚举常量实现String方法。

这里需要提及官方的另外一个工具stringer,它可以自动为整数常量集编写String()方法。由于stringer并不在Go官方发行版的工具集里,我们需要自行安装,执行如下命令。

go get golang.org/x/tools/cmd/stringer

这里引用stringer文档中的一个示例。代码如下,其定义了一组不同Pill类型的整数常量。

package painkillertype Pill intconst (    Placebo Pill = iota    Aspirin    Ibuprofen    Paracetamol    Acetaminophen = Paracetamol)

为了进行调试或者其他原因,我们希望这些常量能够打印出来,这意味着Pill要有一个带有签名的方法。

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)}

试想,如果我们的Pill名单里新增了一批药品名,每次增加或修改药品名,在相应的签名函数里,也都需要进行更改。这样岂不是很麻烦且很可能遗漏或出错?这时,我们可以通过 go generate + stringer的方案解决该问题。很简单,只需在定义Pill的代码中,增加一句注释语句即可。

//go:generate stringer -type=Pill

上面的命令,代表运行stringer工具来为Pill类型生成String方法,默认输出到pill_string.go文件中,执行如下。

$ go generate$ cat pill_string.go// Code generated by stringer -type Pill pill.go; DO NOT EDIT.package painkillerimport "fmt"const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"var _Pill_index = [...]uint8{0, 7, 14, 23, 34}func (i Pill) String() string {    if i < 0 || i+1 >= Pill(len(_Pill_index)) {        return fmt.Sprintf("Pill(%d)", i)    }    return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]}

这样,每次我们对Pill类型有修改时,我们所需要做的就是运行以下语句即可。

$ go generate

当然,你要是觉得这样麻烦,或者担心忘记执行generate语句。那么,可以将go generate语句写入Makefile之中,置于go build命令之前,实现代码生成与编译的自动化。

值得一提的是,在Go源码文档中,大量采用了go generate+stringer的方案实现对枚举常量的String方法。在小菜刀本机Go 1.14.1的源码下,一共有23处使用,具体如下。

go generate命令怎么使用

“go generate命令怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

go generate命令怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

go generate命令怎么使用

本篇内容介绍了“go generate命令怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!“go generate”命令的作用是在编译
2023-07-05

活用go generate命令打造高效代码

go generate 命令允许在构建时生成代码,以优化开发和提高代码质量。步骤如下:创建包含命令的 go.generate 文件。使用 -generate 标志注册 generate 文件。gen.go 脚本生成代码,输出到 facts.
活用go generate命令打造高效代码
2024-04-08

Go语言中go build命令怎么用

这篇文章主要介绍了Go语言中go build命令怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。go build1. 用于测试编译多个包或一个main包2. build命
2023-06-25

Go语言中go install命令怎么用

小编给大家分享一下Go语言中go install命令怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go install编译并安装代码包,对于库,会生成目标库
2023-06-25

Go语言中go fmt命令怎么用

这篇文章主要为大家展示了“Go语言中go fmt命令怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Go语言中go fmt命令怎么用”这篇文章吧。go fmt命令主要是用来帮你格式化所写好的
2023-06-25

dos命令行choice命令怎么使用

在Windows系统中,choice命令用于让用户在几个选项中做出选择。下面是choice命令的基本语法和用法:choice [/c choices] [/n] [/cs] [/t timeout /d choice] [/m text]
dos命令行choice命令怎么使用
2024-03-01

Linux的blkid命令命令怎么使用

这篇文章主要介绍“Linux的blkid命令命令怎么使用”,在日常操作中,相信很多人在Linux的blkid命令命令怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux的blkid命令命令怎么使用
2023-06-28

pgrep命令怎么使用

本篇内容介绍了“pgrep命令怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pgrep 是通过程序的名字来查询进程的工具,一般是用来
2023-06-27

怎么使用git命令

今天小编给大家分享一下怎么使用git命令的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。安装Git在开始使用Git之前,您需要
2023-07-05

jstat命令怎么使用

这篇文章主要介绍了jstat命令怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jstat命令怎么使用文章都会有所收获,下面我们一起来看看吧。jstat的用法:jstat [ generalOption,
2023-06-27

VBoxManage命令怎么使用

VBoxManage命令是VirtualBox软件自带的命令行工具,用于管理虚拟机的各种操作。以下是VBoxManage命令的常用用法:1. 列出所有的虚拟机:```VBoxManage list vms```2. 启动虚拟机:```VBo
2023-09-13

Ldapsearch命令怎么使用

Ldapsearch命令是用于搜索和检索LDAP(轻量级目录访问协议)服务器中的信息。下面是Ldapsearch命令的基本使用方法:1. 打开终端或命令提示符。2. 输入以下命令格式:```ldapsearch [选项] [过滤器] [属性
2023-09-14

Git命令怎么使用

今天小编给大家分享一下Git命令怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。常用 Git 命令清单。几个专用名词的
2023-06-29

cmd命令怎么使用

这篇文章主要介绍“cmd命令怎么使用”,在日常操作中,相信很多人在cmd命令怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”cmd命令怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!10个很酷
2023-07-01

vmstate命令怎么使用

今天小编给大家分享一下vmstate命令怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1。 使用vmstat使用前我
2023-07-02

ipvsadm命令怎么使用

ipvsadm命令是用于管理Linux Virtual Server (LVS) 的工具。它可以用于设置和管理IP负载均衡。使用ipvsadm命令有一些常用的选项和参数,下面是一些常见的用法示例:1. 列出当前的IPVS规则:```ipvs
2023-09-14

怎么使用Laravel命令

这篇文章主要介绍“怎么使用Laravel命令”,在日常操作中,相信很多人在怎么使用Laravel命令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Laravel命令”的疑惑有所帮助!接下来,请跟着小编
2023-06-25

expr命令怎么使用

本篇内容介绍了“expr命令怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!expr命令可以实现数值运算、数值或字符串比较、字符串匹配
2023-06-28

envsubst命令怎么使用

这篇文章主要介绍“envsubst命令怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“envsubst命令怎么使用”文章能帮助大家解决问题。0 | 是什么envsubst 缩写来自于 envi
2023-07-06

mkfs命令怎么使用

这篇文章主要介绍了mkfs命令怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mkfs命令怎么使用文章都会有所收获,下面我们一起来看看吧。mkfs命令用于在设备上(通常为硬盘)创建Linux文件系统。mk
2023-06-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录