原生 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。