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

发布于 1周前 作者 caililin 来自 Go语言

Golang Go语言中遇到一个神奇的错误,怀疑可能和编译器或者调试器有关
func test() error {
return nil
}

other code…

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

函数里面是一致返回的 nil ,神奇的是单步调试的时候 err 的值居然不为 nil ,但是加上打印 err ,err 就变成了 nil 并不会进入 if 逻辑。

9 回复

这并不是编译器错误,搜索“go nil!=nil”

更多关于Golang Go语言中遇到一个神奇的错误,怀疑可能和编译器或者调试器有关的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


盲猜中间存在有类型的 error ,Go 中任何 interface 的 nil 必须同时满足动态类型为 nil 和动态值也为 nil

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
}

没特别注意过这一点,学习了!

经典问题, interface 的 类型信息 和 值, 两者都为 nil, 才会 interface == nil. 简单说就是 err != nil 是因为有类型信息.

哈哈,楼上都猜错了,正确答案是,调试器或者 JetBrains 问题

我重新尝试了你的代码,err 一直都是 nil ,只是调试器会提示 invalid interface type: could not found str field

在Go语言(Golang)开发中遇到看似与编译器或调试器相关的神奇错误时,确实会让人感到困惑。不过,这类问题通常可以通过几个步骤来排查和解决:

  1. 确认错误复现性:首先,确保错误是可以在相同环境下稳定复现的。这有助于排除偶然因素。

  2. 检查代码:重新审查引发错误的代码段,特别注意变量作用域、并发访问和数据竞争等问题。Go的竞态检测工具(go run -race)可以帮助发现这些问题。

  3. 更新工具链:确保你的Go编译器(go命令)、调试器(如Delve)和其他相关工具都是最新版本。有时候,这类错误可能是由旧版本中的已知bug引起的。

  4. 查阅文档和社区:搜索Go语言的官方文档、FAQ、Stack Overflow和GitHub Issues,看看是否有其他开发者遇到过类似问题。

  5. 简化问题:尝试创建一个最小化的可复现问题的代码示例。这不仅有助于自己理解问题,也方便在求助社区时提供清晰的信息。

  6. 使用不同的编译器/调试器:如果可能,尝试使用不同版本的Go编译器或调试器,看看问题是否依旧存在。

  7. 报告问题:如果上述步骤都无法解决问题,并且你确信这是一个编译器或调试器的bug,可以考虑向Go语言的官方问题追踪系统提交报告。

希望这些建议能帮助你解决遇到的神奇错误!

回到顶部