c++ 判断nil_golang A=nil,B=A,but B!=nil 这是真的

一、现象

      在某次开发过程中,想把参数验证放在middleware中封装达到提升开发效率的目的,结果出现了如下图所示的现象,验证返回的err明明是nil,但是用if判断的时候err却不是nil

  c57562cd758b8886ed41db957b87b9f4.png (图1 middleware 调用判断非nil)再来看看被调用函数里面的确是nil,为什么返回后变成非nil了呢? f6b928dc4082c4b2d346a06d2da1b4b1.png (图2 被调用函数vm.ValidateJson 里面确实是nil )  fd59dcc54379c7aba049a540b26763ea.png (图3 输出被调用函数里面是nil, 返回后的判断变成了非nil) 

二、原因猜想

  1. 由于golang多返回值的实现是在栈内存中申请空间实现的,是否是什么原因改变了栈内存中的数据,导致了上述问题?

  2. 由于return 某个变量,涉及到了隐式转换,触及到了知识盲区,未知情况出现了上述问题?

 

三、排查过程

1. 代码简化

首先去除逻辑,对代码进行了简化,下面是简化后的代码
package mainimport (   "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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值