首页 >后端开发 >Golang >为什么我的 Go 代码中会出现'恐慌:运行时错误:无效的内存地址或 nil 指针取消引用”错误?

为什么我的 Go 代码中会出现'恐慌:运行时错误:无效的内存地址或 nil 指针取消引用”错误?

Patricia Arquette
Patricia Arquette原创
2024-12-26 05:06:10805浏览

Why am I getting a

Go: 恐慌:运行时错误:无效的内存地址或 nil 指针取消引用

问题

调用 Go 时,它会显式恐慌并显示以下消息:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x38 pc=0x26df]

goroutine 1 [running]:
main.getBody(0x1cdcd4, 0xf800000004, 0x1f2b44, 0x23, 0xf84005c800, ...)
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:65 +0x2bb
main.getToken(0xf84005c7e0, 0x10)
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:140 +0x156
main.main()
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:178 +0x61

goroutine 2 [syscall]:
created by runtime.main
        /usr/local/Cellar/go/1.0.3/src/pkg/runtime/proc.c:221

goroutine 3 [syscall]:
syscall.Syscall6()
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/asm_darwin_amd64.s:38 +0x5
syscall.kevent(0x6, 0x0, 0x0, 0xf840085188, 0xa, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/zsyscall_darwin_amd64.go:199 +0x88
syscall.Kevent(0xf800000006, 0x0, 0x0, 0xf840085188, 0xa0000000a, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/syscall_bsd.go:546 +0xa4
net.(*pollster).WaitFD(0xf840085180, 0xf840059040, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/net/fd_darwin.go:96 +0x185
net.(*pollServer).Run(0xf840059040, 0x0)
        /usr/local/Cellar/go/1.0.3/src/pkg/net/fd.go:236 +0xe4
created by net.newPollServer
        /usr/local/Cellar/go/1.0.3/src/pkg/net/newpollserver.go:35 +0x382

回答

恐慌:运行时错误:当资源缺少内存地址时,会出现无效的内存地址或零指针取消引用,称为零指针取消引用。当您尝试使用不指向任何内容的指针或访问 nil 指针的字段时,通常会发生这种情况。

要解决此问题:

  1. 检查 nil指针: 确保您没有将任何变量或结构字段分配为 nil 值。
  2. 验证内存地址: 确保您没有尝试访问不存在的内存地址。利用 & 运算符获取变量或结构体字段的地址。
  3. 调试代码:使用 delve 等调试器或内置调试包来单步执行代码并识别哪一行引起了恐慌。错误消息中提供的堆栈跟踪可以帮助查明有问题的代码。
  4. 检查堆栈跟踪:堆栈跟踪提供有关导致恐慌的函数调用的宝贵信息,这可以帮助确定问题的根源。

在给定的代码中,尝试关闭 res.Body 时 getBody 函数中发生了恐慌。根据 func (*Client) Do 的文档,仅当由客户端策略或 HTTP 协议错误引起时才会返回错误,并且成功的响应将始终包含非零正文。

建议的修改是:

res, err := client.Do(req)

if err != nil {
    return nil, err
}
defer res.Body.Close()

通过在尝试使用 res.Body 之前检查 err,您可以优雅地处理请求期间可能发生的任何错误并避免恐慌。

以上是为什么我的 Go 代码中会出现'恐慌:运行时错误:无效的内存地址或 nil 指针取消引用”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn