首頁 >後端開發 >Golang >為什麼我的 Go 程式碼中會出現「恐慌:運行時錯誤:無效的記憶體位址或 nil 指標取消引用」錯誤?

為什麼我的 Go 程式碼中會出現「恐慌:運行時錯誤:無效的記憶體位址或 nil 指標取消引用」錯誤?

Patricia Arquette
Patricia Arquette原創
2024-12-26 05:06:10800瀏覽

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