generate工具的使用以及源码解释| 青训营笔记

200 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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 

image.png

如上图,点击运行键即可
第二种:在命令行执行:stringer -type ErrCode -linecomment
二者都会在当前目录下生成对应的代码,如图

image.png

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中读取对应的解释
}