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
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:
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()
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!