示例:

大家经常碰到命名错误码、状态码的同时,又要同步写码对应的翻译,有没有感觉很无聊。这里举一个例子:

package main

import "fmt"

// 定义错误码
const (
ERR_CODE_OK = 0 // OK
ERR_CODE_INVALID_PARAMS = 1 // 无效参数
ERR_CODE_TIMEOUT = 2 // 超时
)

// 定义错误码与描述信息的映射
var mapErrDesc = map[int]string{
ERR_CODE_OK: "OK",
ERR_CODE_INVALID_PARAMS: "无效参数",
ERR_CODE_TIMEOUT: "超时",
}

// 根据错误码返回描述信息
func GetDescription(errCode int) string {
if desc, exist := mapErrDesc[errCode]; exist {
return desc
}

return fmt.Sprintf("error code: %d", errCode)
}

func main() {
fmt.Println(GetDescription(ERR_CODE_OK))
}

这是一种重复性操作,没有什么技术含量,另外很可能忘记写映射。我只想写错误码,对应的描述信息直接用注释里的就行,所以这里介绍一下对应的工具。

go generate

go有很多工具,大家可以通过go命令查看。

go generate是 Go 自带的工具。使用命令go generate执行。go generate是利用源代码中的注释工作的。格式如下:

//go:generate command arg1 arg2

这样在同一个目录下执行命令go generate就会自动运行命令command arg1 arg2command可以是在PATH中的任何命令,应用非常广泛。配合stringer命令可以为给定类型生成String方法,就可以实现我们的想法。

安装stringer

stringer不是Go自带工具,需要手动安装。执行如下命令即可

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

使用

有两种执行方案,

一种是在errcode中,增加注释//go:generate stringer -type ErrCode -linecomment

另一种是直接命令行执行stringer -type ErrCode -linecomment

执行完毕会发现自动生成新文件

关于stringer的命令,大家可以通过stringer -h查看

注意点:

  1. go:generate前面只能使用//注释,注释必须在行首,前面不能有空格且//go:generate之间不能有空格!!!
  2. go:generate可以在任何 Go 源文件中,最好在类型定义的地方。

自动化:

  makefile 中:

all:
go generate && go build .

demo文件: errcode.go源文件,errcode_test.go测试文件 errcode_string.go生成文件

errcode.go

package errcode

// ErrCode 表示错误码
type ErrCode int //go:generate stringer -type ErrCode -linecomment -output code_string.go
// -type指定类型
// -output code_string.go 指定生成的文件名称
// -linecomment 将注释名称作为错误描述

// 定义错误码
const (
ERR_CODE_OK ErrCode = 0 // OK
ERR_CODE_INVALID_PARAMS ErrCode = 1 // 无效参数
ERR_CODE_TIMEOUT ErrCode = 2 // 超时
// ...
)

errcode_test.go

package errcode

import "testing"

func TestCode(t *testing.T) {
cases := []struct {
errCode ErrCode
expect string
}{
{ERR_CODE_OK, "OK"},
{ERR_CODE_INVALID_PARAMS, "无效参数"},
{ERR_CODE_TIMEOUT, "超时"},
} for _, testCase := range cases {
if testCase.errCode.String() != testCase.expect {
t.Errorf("error code %d description inconsistant actual:%s expect:%s", int(testCase.errCode), testCase.errCode, testCase.expect)
}
}
}

errcode_string.go

// Code generated by "stringer -type ErrCode -linecomment"; DO NOT EDIT.

package errcode

import "strconv"

const _ErrCode_name = "OK无效参数超时"

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

执行测试:

go generate
or
go generate ./... go test

golang工具之generate的更多相关文章

  1. golang工具之present - 编写go特色的ppt

    简介: Golang Present 是 Golang 社群开发出來的一个简单工具,通过简单的语法可以制作 ppt(语法近似于 Markdown).   默认文件格式是 .slide ,是随着 gol ...

  2. golang 性能调优分析工具 pprof (上)

    一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...

  3. 浅析 golang module

    什么是 module?module 解决了什么问题? module 代表一个版本管理单元,它包括一个或者多个 packages. 一般来说,一个版本控制仓库(比如 golang.org/x/text  ...

  4. NDK工具制作

    NDK工具制作 - Generate a stand-alone toolchain of the NDK, example: `./android-ndk-r10/build/tools/make- ...

  5. 使用Truffle 部署智能合约

    使用Truffle 部署智能合约 之前我们使用Geth,原生的以太坊Golang工具,分析了创世区块的参数内容,在本地创建了私有以太坊区块链,并使用两个账户进行了挖矿和转账操作,对以太坊有了基本了解. ...

  6. Gruntjs: grunt-contrib-jst

    预编译Underscore模板到JST文件(Underscore:JS工具库) generate JavaScript template functions Gruntfile的配置实例: modul ...

  7. JavaBean基础

    JavaBean的概念 JavaBean是一种可重复使用.且跨平台的软件组件.JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean:还有一种是没有用户界 ...

  8. Awesome Go

    A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...

  9. 阿里巴巴Java开发手册快速学习

    Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...

  10. 《阿里巴巴 Java 开发手册》读书笔记

    偶然看到阿里巴巴居然出书了???趁着满减活动(节约节约....)我赶紧买来准备看看,刚拿到的时候掂量了好多下,总觉得商家给我少发了一本书,结果打开才知道..原来这本书这么小.... 编码规范的重要性 ...

随机推荐

  1. CLion 2022.2.4破解教程详细图解mac,windows,linux均适用

    下载与安装 此教程为CLion 2022.2.4 破解教程,且此教程以及下面提供的破解补丁适用与2022.2以后的新版本. 2022年11月10日亲测有效,mac与windows均测试完美破解 CLi ...

  2. ES7学习笔记(二)ES的集群原理

    发现 发现是节点之间彼此发现,形成集群的一个过程.这个过程发生的场景有很多,比如:你启动了一个集群节点,或者一个节点确认主节点已经挂掉了,或者一个新的主节点被选举了. 咱们在配置集群的时候在配置文件中 ...

  3. Asp.net Core 学习笔记 Azure Storage

    更新: 2021-07-22 使用 Azure storage 以后, 还要解决一个 url 的问题. 文件自然是通过我们的 domain 来访问才合理丫. 这个是 azure 的 url : htt ...

  4. OData – Query to Expression

    前言 EF Core 可以把 expression 转换成 string, 但没办法转回来. 想把 string 转成 expression, 目前最合适的工具是 OData. 虽然 Dynamic ...

  5. Linux下挂载SD卡,以及容易犯的误区

    1.插入SD卡 如果系统能够识别SD卡,则会打印一些信息: 2.查看系统给SD卡分配的设备名 命令如下: fdisk -l 说明:通常是根据SD卡的存储容量来确定的. 比如下面的信息: 3.挂载SD卡 ...

  6. SuperMap iServer数据动态更新刷新地图与数据服务

    更新:2022年6月27日 SuperMap iServer 11i 底层修改逻辑,增加智能指针.11i版本不需要以下操作即可实现 一.使用背景 有这么一个需求,后端也就通过SuperMap iDes ...

  7. P1438 无聊的数列 题解

    背景 看到题解都是差分,竟然还有建两颗线段树和二阶差分的大佬. 我感到不理解,很不理解. 题目正解 本题正解很明显就是:线段树 是的,你没有看错,就只有线段树. 很显然我们直接按照线段树板题写就可以了 ...

  8. Oracle ADG 自动切换脚本分享

    为大家分享一个[Oracle ADG自动切换]的脚本,由云和恩墨工程师HongyeDBA编写,支持Switchover.Failover. 下载链接:https://www.modb.pro/down ...

  9. 墨天轮PostgreSQL精品学习资源合集(含基础手册、实操技巧&案例、书籍推荐)

    近日,PostgreSQL 15 的第一个 beta 版本发布,这一最新版本在开发者体验.性能表现等方面都有提升.从最新的DB-Engines排名可以发现,PostgreSQL近十年来得分一路高涨,目 ...

  10. These dependencies were not found: * core-js/modules/es.array.push.js in ./node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js

    yarn add core-js  安装core-js包 : 出现这个问题的原因:因为vue-admin-template的package.json里没写这个包core-js,然后再咱们yarn装包的 ...