原生 err 和 业务 err 混淆
场景复现
自定义了业务 err:MyErr,实现了 Error() 方法。
在业务代码使用中,由于疏忽,同时使用了 原生 err 和 业务err
原因
golang 中,判断 interface 的 nil,类型和值同时为nil时,结果才是nil。具体参考 https://trstringer.com/go-nil-interface-and-interface-with-nil-concrete-value/,通俗易懂。
解决方案
方法1:业务 err,不实现 Error() 方法,这样可以在编译时发现问题,提早解决。(推荐,但在公司不一定能推广)
方法2:使用局部变量 err (有时候比较好用)
方法3: 注意区分每个方法返回值是原生 err 还是业务 err,为业务 err 重新声明变量。(养成习惯注意一下)
方法4: 重新自己封装一个判断 nil 的方法???
:= 不小心声明了局部变量
场景复现
object, err := xxxx
在已声明变量 object,未声明变量 err 的情况下,使用上述声明方式,会声明一个新的 object 变量。
而由于 golang 中要对每个 err 进行处理,又不想为每个 err 单独命名,所以常常会触发这种局部变量的 bug。