一、现象
在某次开发过程中,想把参数验证放在middleware中封装达到提升开发效率的目的,结果出现了如下图所示的现象,验证返回的err明明是nil,但是用if判断的时候err却不是nil
![c57562cd758b8886ed41db957b87b9f4.png](https://img-blog.csdnimg.cn/img_convert/c57562cd758b8886ed41db957b87b9f4.png)
![f6b928dc4082c4b2d346a06d2da1b4b1.png](https://img-blog.csdnimg.cn/img_convert/f6b928dc4082c4b2d346a06d2da1b4b1.png)
![fd59dcc54379c7aba049a540b26763ea.png](https://img-blog.csdnimg.cn/img_convert/fd59dcc54379c7aba049a540b26763ea.png)
二、原因猜想
由于golang多返回值的实现是在栈内存中申请空间实现的,是否是什么原因改变了栈内存中的数据,导致了上述问题?
由于return 某个变量,涉及到了隐式转换,触及到了知识盲区,未知情况出现了上述问题?
三、排查过程
1. 代码简化
首先去除逻辑,对代码进行了简化,下面是简化后的代码
package main
import (
"fmt"
)
type TestError struct {
}
func (te *TestError) Error() string {
return "error happened"
}
func testError() *TestError {
return nil
}
func test() error {
return testError()//如果此处修改为return nil,结果会return true 符合预期
}
func main() {
err := test()
fmt.Println(err == nil) //输出 false
}