Menetapkan Penunjuk Int kepada Nilai Int dalam Go
Dalam Go, tugas biasa ialah menetapkan nilai kepada penuding int. Walau bagaimanapun, ralat yang ditemui baru-baru ini dalam coretan kod memberi penerangan tentang kemungkinan perangkap:
package main import ( "fmt" "reflect" ) func main() { var guess *int fmt.Println(reflect.TypeOf(guess)) *guess = 12345 fmt.Println(guess) }
Apabila melaksanakan kod ini, ralat berikut berlaku:
Type: *int panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x483c7d] goroutine 1 [running]: main.main() /home/aaron/projects/gopath/src/github.com/AaronNBrock/go-guess/main.go:16 +0x9d exit status 2
Punca utama terletak pada hakikat bahawa tekaan penunjuk pada mulanya ditetapkan kepada sifar. Penyahrujukan penuding nol membuang ralat masa jalan, seperti yang dilihat dalam mesej ralat. Penyelesaiannya terletak pada memperuntukkan memori untuk penuding sebelum cuba memberikan nilai kepadanya:
var guess *int guess = new(int) *guess = 12345
Pengubahsuaian ini memastikan tekaan menunjukkan lokasi memori yang sah, membolehkan kami menetapkan dan mendapatkan semula nilainya.
Sebagai alternatif, menggunakan pengisytiharan pembolehubah pendek boleh memudahkan kod:
guess := new(int) *guess = 12345
Pendekatan lain adalah untuk tetapkan alamat pembolehubah sedia ada kepada penuding:
value := 12345 // will be of type int guess := &value
Penyelesaian ini menunjukkan tekaan kepada pembolehubah sedia ada, dan bukannya memperuntukkan memori baharu. Menukar nilai ditunjuk juga mengubah suai nilai pembolehubah asal.
Akhir sekali, perlu diingat bahawa menuding penunjuk ke lokasi dan memberikan nilai kepadanya adalah operasi yang berbeza. Yang pertama memperuntukkan memori atau menetapkan penuding kepada pembolehubah sedia ada, manakala yang terakhir mengubah suai nilai yang disimpan di lokasi yang ditunjuk.
Atas ialah kandungan terperinci Bagaimana untuk Menetapkan Nilai dengan betul kepada Penunjuk Int dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!