golang错误码再也不用维护了,快快学起来

简介: golang错误码再也不用维护了,快快学起来

无论你今天怎么用力,明天的落叶还是会飘下来,世上有很多事是无法提前的,活在当下,正向提升。

640.png


1. 前言



开发中经常有定义错误码这样的需求,错误码唯一标识具体的错误信息。另外还需要设置每个错误的具体描述。比如在HTTP协议中,200表示 "OK",404表示"Not Found",那如何在我们的项目中添加这样的错误码呢?手动?还是自动?


2. 手动的情况



package main
import "fmt"
type ErrCode int
// 定义错误码
const (
 ERR_OK ErrCode = iota   //请求OK
 ERR_PARAMS    //请求参数出错
 ERR_TiMEOUT    //请求超时
)
// 定义错误码与描述信息的映射
var mapErrDesc = map[ErrCode]string {
 ERR_OK: "OK",
 ERR_PARAMS: "无效参数",
 ERR_TiMEOUT: "超时",
}
//实现String() 这样print会调用String()
func (e ErrCode) String() string {
 return GetDescription(e)
}
// 根据错误码返回描述信息
func GetDescription(errCode ErrCode) string {
 if desc, exist := mapErrDesc[errCode]; exist {
  return desc
 }
 return fmt.Sprintf("error code: %d", errCode)
}
func main() {
 fmt.Println(ERR_TiMEOUT)
 if ERR_OK == 0 {
  fmt.Println(ERR_OK)
 }
}


输出:

超时
OK


看到了吗,我们既可以拿错误码进行业务逻辑判断,又可以按照我们想要的方式输出,但是这样有个问题就是每次增加错误码时,都需要修改mapErrDesc,有时候可能会忘。另外,错误描述在注释和mapErrDesc都出现了。那么能不能只写注释,然后使用工具自动生成我们想要的代码呢?


3. 自动



package main
import "fmt"
type ErrCode int
//go:generate stringer -type ErrCode -linecomment -output code_string.go
const (
 ERR_OK ErrCode = iota //请求OK
 ERR_PARAMS//请求参数出错
 ERR_TiMEOUT//请求超时
)
func main() {
 fmt.Println(ERR_OK)
 fmt.Println(ERR_PARAMS)
 fmt.Println(ERR_TiMEOUT)
 if ERR_OK == 0 {
     fmt.Println(ERR_OK)
 }
 if ERR_TiMEOUT == 2 {
  fmt.Println(ERR_TiMEOUT)
 }
}


在同级目录下终端输入go generate就会自动生成code_string.go,然后我们运行go run main.go输出:


请求OK
请求参数出错
请求超时
请求OK
请求超时


go generate是 Go 自带的工具。使用命令go generate执行。但是前提就是在你的错误码常量之前增加以下代码,如下所示:


//go:generate stringer -type ErrCode -linecomment -output code_string.go


go generate利用stringer生成字符串描述,默认stringer有两种模式,默认是根据变量/常量名来生成。


  1. 选项-type指定stringer命令作用的类型名,这里是ErrCode
  2. 选项-output指定输出文件名,这里是code_string.go
  3. 选项-linecomment指定后面的注释作为错误描述,比如"超时"


stringer可以自己安装,安装目录如下:


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


我们看下生成的code_string.go:


// Code generated by "stringer -type ErrCode -linecomment -output code_string.go"; DO NOT EDIT.
package main
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_OK-0]
 _ = x[ERR_PARAMS-1]
 _ = x[ERR_TiMEOUT-2]
}
const _ErrCode_name = "请求OK请求参数出错请求超时"
var _ErrCode_index = [...]uint8{0, 8, 26, 38}
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]]
}

我们看到它是节约存储错误码信息以及实现了String方法,这样就比我们自己实现好多了。


4. 小结



通过这种自动生成的方式,我们开发人员再也不用担心维护那么多错误码描述信息了,只要你的注释是ok的,那么你就直接使用错误码常量就行,哪里作为判断,哪里作为展示输出就特别方便了。


5. 关注公众号



 微信公众号:堆栈future

相关文章
|
4月前
|
SQL 安全 数据库连接
《Go 简易速速上手小册》第6章:错误处理和测试(2024 最新版)(上)
《Go 简易速速上手小册》第6章:错误处理和测试(2024 最新版)
63 1
|
Java 容器
阿里内部流传的JDK源码剖析手册!GitHub已获上千万的访问量
相信现在已经有很多小伙伴知道了“微软”要对JDK下手了! JDK是什么? jdk是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。jdk是整个java开发的核心,它包含了JAVA的运行环境和JAVA工具。相对而言,没有jdk的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
254 0
|
4月前
|
JSON 测试技术 Go
《Go 简易速速上手小册》第6章:错误处理和测试(2024 最新版)(下)
《Go 简易速速上手小册》第6章:错误处理和测试(2024 最新版)
52 0
|
27天前
|
Kubernetes Nacos 数据安全/隐私保护
疯了!Nacos 用 Helm 部署开启授权认证频频出错?别急,秘籍在此!
【8月更文挑战第15天】本文指导您通过Helm部署Nacos并开启授权认证,解决途中遇到的问题。首先确认已安装Helm并了解Kubernetes基础。示例`values.yaml`文件启用认证并设置凭据。运行Helm命令完成部署。若认证失败,请复查用户名及密码准确性。面对权限不足错误,可配置权限策略,示例代码展示基于请求头的简单验证逻辑。Nacos启动异常时,利用`kubectl logs`命令分析Pod日志定位问题。遵循本文步骤与示例,助您成功部署并配置Nacos。
36 0
|
缓存 NoSQL Java
GitHub笔记疯抢竟崩溃!Redis完整开发实战居然包含大厂同款项目
现在阿里、腾讯这样的大厂和大部分互联网公司,基本上都需要使用到Redis技术。网上发布的Java开发工程师岗位的招聘信息,对Redis的要求都是熟练掌握。 而且现在大厂的大部分面试题都和Redis有关,尤其是在阿里、字节、华为、腾讯的后端面试中,只要你的项目中涉及到Redis,面试官大部分都会针对Redis提问!很多Redis的提问还特别深入……没答上来就非常可惜了。 所以千万不要小看Redis! 学习推荐 作为Java程序员,选择学习什么样的技术?什么技术该不该学?去招聘网站上搜一搜、看看岗位要求就十分清楚了,自己具备的技术和能力,直接影响到你工作选择范围和能不能面试成功。
94 0
|
11月前
|
JSON Go API
No.8 Golang开发新手常犯的50个错误(下)
No.8 Golang开发新手常犯的50个错误
|
11月前
|
缓存 安全 Go
No.8 Golang开发新手常犯的50个错误(上)
No.8 Golang开发新手常犯的50个错误
|
API Android开发 图形学
[持续更新]细数那些Compose新手容易犯的错误(二)
[持续更新]细数那些Compose新手容易犯的错误
157 0
|
Android开发 开发者 容器
[持续更新]细数那些Compose新手容易犯的错误(一)
[持续更新]细数那些Compose新手容易犯的错误
229 0
|
消息中间件 JSON 安全
Golang:手撸一个支持六个级别的日志库
Golang:手撸一个支持六个级别的日志库
110 0