Menghadapi "Medan tidak diketahui dalam jejak tindanan panik" yang membingungkan adalah perkara biasa apabila menyahpepijat ralat panik dalam Go. Untuk merungkai enigma ini, mari kita mendalami kerumitan surih tindanan.
Dalam coretan kod yang disediakan:
package main func F(a int) { panic(nil) } func main() { F(1) }
Menjalankan atur cara mendedahkan surih tindanan panik:
panic: nil goroutine 1 [running]: main.F(0x1, 0x10436000) /tmp/sandbox090887108/main.go:4 +0x20 main.main() /tmp/sandbox090887108/main.go:8 +0x20
Apakah kepentingan nilai samar 0x10436000 yang disebut bersama F(0x1)?
Nilai 0x10436000 bukan hujah kedua kepada fungsi tersebut. Sebaliknya, ia mewakili nilai data mentah yang dihantar sebagai argumen pertama, dinyatakan sebagai nilai bersaiz penunjuk. Ini adalah hasil daripada seni bina taman permainan, yang menampilkan saiz perkataan 64-bit tetapi penunjuk 32-bit (GOARCH=amd64p32).
Dalam fail traceback.go, nilai dicetak dengan mengakses argumen secara berulang berdasarkan saiz penunjuknya:
for i := uintptr(0); i < frame.arglen/sys.PtrSize; i++ {
Ini bermakna memandangkan saiz perkataan adalah dua kali ganda saiz penunjuk di taman permainan, pasangan nilai dicetak dalam setiap argumen bingkai.
Untuk menggambarkan lebih lanjut:
func F(a uint8) { panic(nil) }
Memanggil keputusan F(1) dalam:
main.F(0x97301, 0x10436000)
Hanya 8 bit pertama perkataan 64-bit digunakan (1 dalam kes ini), manakala bakinya tidak digunakan.
main.F(0x100000001, 0xc400000001)
Tiga argumen menduduki dua perkataan dan nilai tambahan yang tidak digunakan dicetak.
func F(a int64) (int, int)
Pada amd64, argumen bingkai tindanan akan muncul sebagai:
main.F(0xa, 0x1054d60, 0xc420078058)
Perkataan pertama adalah untuk hujah, manakala dua lagi adalah untuk nilai pulangan yang tidak dimulakan.
Atas ialah kandungan terperinci Apakah kepentingan 'Medan tidak diketahui' dalam surih tindanan panik Go, dan bagaimanakah kita boleh menyahkod hujah dalam surih balik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!