前言
接上回
正文
错误消息
Go中声明错误有几种方式
- errors.New() 简单的声明静态字符串信息的错误
- fmt.Errorf 可以格式化插入信息的错误
- 自己实现 Error() 方法
- 使用errors.Wrap
在使用错误时,需要根据使用场景来判断哪种是适合的 - 如果只需要简单的静态错误信息, 不需要额外的一些定制的错误信息, 只需要使用 errors.New() 即可
- 需要错误的上下文, 或者加入些时间等动态信息, 使用 fmt.Errorf 即可
如果客户端需要检测这个错误, 可以自己实现一个 Error() 方法,当然 errors.New() 也可以
示例:
将静态错误给客户端检测
将动态错误给客户端检测
建议如果错误提供给客户端,应当再定义一个检查是否是该错误的函数,而不是由客户端手动检测
错误包装
在包装错误时,要加上错误的上下文来增加可读性
包装错误时,注意不要添加多余的内容,比如
但是注意,如果此错误需要和日志一起返回给客户端,则需要注意加上 filed 或者 err 来与普通日志进行区分处理类型断言
在使用类型断言时,应当接收 ok 进行判断,如果不接受 ok 会引发panic
不要引发Panic
一定要注意,在生产环境中运行的代码一定不要引发Panic,你可以返回err来让调用者安全的解决问题
但是在程序的初始化过程中出现问题则可以引发Panic来停止程序的执行
即使在编写test测试时,也不要直接写 panic 而是 t.Fatal 或者 t.FailNow使用 go.uber.org/atomic
软广?
避免全局可变变量
一般的在全局变量初始化成功后不要修改他,可以创建局部变量代替
错误示范
正确的
避免在公共结构中嵌入类型
尽量少的使用继承
推荐用法
性能
优先使用 strconv 而不是 fmt
我们将 int 转换成 str 时, 可以使用 fmt.Sprint() 也可使用 strconv.Itoa()
但是