Rumah > pembangunan bahagian belakang > Golang > Mengapa saya mendapat ralat 'panic: runtime: alamat memori tidak sah atau nol pointer dereference' dalam kod Go saya?

Mengapa saya mendapat ralat 'panic: runtime: alamat memori tidak sah atau nol pointer dereference' dalam kod Go saya?

Patricia Arquette
Lepaskan: 2024-12-26 05:06:10
asal
800 orang telah melayarinya

Why am I getting a

Pergi: panik: ralat masa jalan: alamat memori tidak sah atau penolakan penunjuk tiada

Isu

Apabila menggunakan Go, ia secara jelas panik dengan perkara berikut mesej:

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
Salin selepas log masuk

Jawapan

Panik: ralat masa jalan: alamat memori tidak sah atau nyahrujuk penuding nil timbul apabila sumber kekurangan alamat memori, yang dikenali sebagai nyahrujukan penunjuk nil. Ini biasanya berlaku apabila anda cuba menggunakan penuding yang menghala ke tiada atau apabila mengakses medan penuding nol.

Untuk menyelesaikan masalah ini:

  1. Semak jika tiada. petunjuk: Pastikan anda tidak memberikan sebarang pembolehubah atau medan struktur kepada sifar nilai.
  2. Sahkan alamat memori: Pastikan anda tidak cuba mengakses alamat memori yang tidak wujud. Gunakan & operator untuk mendapatkan alamat medan pembolehubah atau struktur.
  3. Nyahpepijat kod: Gunakan penyahpepijat seperti delve atau pakej nyahpepijat terbina dalam untuk melangkah melalui kod anda dan kenal pasti baris manakah yang menyebabkan panik. Surih tindanan yang disediakan dalam mesej ralat boleh membantu dalam menentukan kod yang bermasalah.
  4. Periksa surih tindanan: Surih tindanan memberikan maklumat berharga tentang panggilan fungsi yang membawa kepada panik, yang boleh membantu dalam mengenal pasti punca isu.

Dalam kod yang diberikan, panik berlaku dalam fungsi getBody apabila cuba menutup res.Body. Menurut docs for func (*Client) Do, ralat hanya dikembalikan jika disebabkan oleh dasar klien atau ralat protokol HTTP, dan respons yang berjaya akan sentiasa mengandungi badan bukan nol.

Pengubahsuaian yang dicadangkan ialah :

res, err := client.Do(req)

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

Dengan menyemak ralat sebelum cuba menggunakan res.Body, anda boleh mengendalikan sebarang ralat yang mungkin berlaku semasa permintaan dan mengelakkan panik.

Atas ialah kandungan terperinci Mengapa saya mendapat ralat 'panic: runtime: alamat memori tidak sah atau nol pointer dereference' dalam kod Go saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan