这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
本文为笔者学习了# Go工具之generate后所做的笔记以及一点思考。 generate是golang提供的,简化开发的小工具,可以为常量声明其对应的解释
1、generate 插件的使用
1.1、前置准备
安装stringer,在终端输入:
go get golang.org/x/tools/cmd/stringer
等待安装完成即可
1.2、使用插件
1.2.1、编写代码
这里借用原文的例子:
package enum
type ErrCode int64 //错误码
const (
ERR_CODE_OK ErrCode = 0 // OK
ERR_CODE_INVALID_PARAMS ErrCode = 1 // 无效参数
ERR_CODE_TIMEOUT ErrCode = 2 // 超时
)
此处自定义了 ErrCode 类型的字段,并且声明了几个具体的错误码
注意,如//OK 的注释代表了错误码对应的解释,将会由generate插件读取并且生成映射
1.2.2、用插件来完成映射
以下有两种方法来生成对应的映射。
第一种:
在代码上添加注释: //go:generate stringer -type ErrCode -linecomment
如上图,点击运行键即可
第二种:在命令行执行:stringer -type ErrCode -linecomment
二者都会在当前目录下生成对应的代码,如图
2、源码解读
让我们来看看生成的代码,下面用注释的方式解释
package enum
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[ERR_CODE_OK-0]
_ = x[ERR_CODE_INVALID_PARAMS-1]
_ = x[ERR_CODE_TIMEOUT-2]
}
//存储映射的数据
const _ErrCode_name = "OK无效参数超时"
//存储对应的下标
//ERR_CODE_OK ErrCode = 0 // OK --》OK长度为2,在_ErrCode_name中存于0~2
//ERR_CODE_INVALID_PARAMS ErrCode = 1 // 无效参数--》“无效参数”长度为12(一个中文长度为3),存于2~14
//ERR_CODE_TIMEOUT ErrCode = 2 // 超时 --》"超时"长度6,存于14~20
var _ErrCode_index = [...]uint8{0, 2, 14, 20}
//对外开放的输出函数
func (i ErrCode) String() string {
if i < 0 || i >= ErrCode(len(_ErrCode_index)-1) {//如果错误码在此中没有,直接输出错误码
return "ErrCode(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _ErrCode_name[_ErrCode_index[i]:_ErrCode_index[i+1]]//否则从_ErrCode_name中读取对应的解释
}