遇到一个神奇的错误,怀疑可能和编译器或者调试器有关

2022-02-17 13:02:44 +08:00
 wlgq2
func test() error {
return nil
}

other code....

err := func()
if nil != err {
//log.println(err)
}

函数里面是一致返回的 nil ,神奇的是单步调试的时候 err 的值居然不为 nil ,但是加上打印 err ,err 就变成了 nil 并不会进入 if 逻辑。
1973 次点击
所在节点    Go 编程语言
8 条回复
sadfQED2
2022-02-17 13:05:57 +08:00
这并不是编译器错误,搜索“go nil!=nil”
SingeeKing
2022-02-17 13:15:30 +08:00
盲猜中间存在有类型的 error ,Go 中任何 interface 的 nil 必须同时满足动态类型为 nil 和动态值也为 nil
SingeeKing
2022-02-17 13:17:25 +08:00
package main

import "fmt"

type AnError struct{}

func (AnError) Error() string {
return "some error"
}

func DoSomething() *AnError {
return nil
}

func main() {
var err error = DoSomething()

fmt.Println(err, err == nil) // nil false
}
jasonkayzk
2022-02-17 14:32:10 +08:00
没特别注意过这一点,学习了!
hzzhzzdogee
2022-02-17 14:59:09 +08:00
经典问题, interface 的 类型信息 和 值, 两者都为 nil, 才会 interface == nil. 简单说就是 err != nil 是因为有类型信息.
wlgq2
2022-02-17 15:32:00 +08:00
哈哈,楼上都猜错了,正确答案是,调试器或者 JetBrains 问题
cyrivlclth
2022-02-17 17:22:24 +08:00
未能复现
cyrivlclth
2022-02-17 17:24:07 +08:00
我重新尝试了你的代码,err 一直都是 nil ,只是调试器会提示 invalid interface type: could not found str field

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/834472

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX