调用 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 指针的字段时,通常会发生这种情况。
要解决此问题:
在给定的代码中,尝试关闭 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中文网其他相关文章!