Apabila menulis program Go, kita sering menghadapi masalah hasil keluaran pembolehubah yang tidak betul. Kadang-kadang masalah ini menyebabkan orang ramai menggaru kepala dan tidak tahu bagaimana untuk menyelesaikannya. Artikel ini membincangkan mengapa nilai pembolehubah yang salah berlaku dan menyediakan beberapa penyelesaian.
Dalam program Go, skop pembolehubah dikawal melalui pendakap kerinting {}. Jika anda mengisytiharkan pembolehubah dalam fungsi dan menetapkan nilainya kepada pembolehubah lain, tetapi pembolehubah lain digunakan di luar fungsi, nilainya tidak akan betul.
Sebagai contoh, atur cara berikut mempunyai masalah ini:
func main() { a := 1 { a := 2 } fmt.Println(a) // 输出为1 }
Dalam atur cara ini, kami mengisytiharkan dua pembolehubah a. Skop pembolehubah pertama ialah keseluruhan fungsi utama, manakala skop pembolehubah kedua berada di dalam pendakap kerinting {}. Kami memberikan nilai kepada pembolehubah di dalam pendakap kerinting, tetapi apabila pembolehubah digunakan di luar fungsi, nilainya masih asal.
Penyelesaian: Jangan isytiharkan pembolehubah dengan nama yang sama dengan nama luar di dalam pendakap kerinting dalam.
Go ialah bahasa yang menyokong pengaturcaraan serentak. Jika berbilang coroutine Go mengakses pembolehubah yang sama pada masa yang sama, dan sekurang-kurangnya satu coroutine sedang mengubah suai pembolehubah ini, maka masalah nilai pembolehubah yang salah akan berlaku.
Sebagai contoh, program berikut mempunyai masalah ini:
func main() { var wg sync.WaitGroup var mu sync.Mutex a := 1 for i := 0; i < 10; i++ { wg.Add(1) go func() { mu.Lock() defer mu.Unlock() a++ wg.Done() }() } wg.Wait() fmt.Println(a) // 输出可能是10,也可能是11 }
Dalam atur cara ini, kami menggunakan kunci yang disediakan oleh pakej penyegerakan untuk melindungi pembolehubah a. Tetapi kami telah mendayakan 10 coroutine pada masa yang sama untuk mengubah suai pembolehubah a, yang akan membawa kepada nilai pembolehubah yang salah.
Penyelesaian: Gunakan mekanisme kunci yang disediakan oleh pakej penyegerakan atau gunakan saluran untuk menyelaraskan akses antara coroutine yang berbeza.
Dalam program Go, penukaran jenis adalah sangat biasa. Tetapi kadangkala penukaran jenis boleh menyebabkan nilai pembolehubah yang salah.
Sebagai contoh, atur cara berikut mempunyai masalah ini:
func main() { var a uint32 = 1 var b uint64 = uint64(a) fmt.Println(b) // 输出为1,而不是4294967297 }
Dalam atur cara ini, kami menukar pembolehubah integer tak bertanda 32-bit a menjadi pembolehubah jenis integer tak bertanda 64-bit. Tetapi kami menjangkakan bahawa nilai keluaran b hendaklah 4294967297, bukan 1.
Penyelesaian: Apabila melakukan penukaran jenis, pastikan jenis sasaran boleh menampung nilai jenis sumber. Di samping itu, apabila menukar jenis titik terapung kepada integer, perhatian harus diberikan kepada isu pembundaran.
Ringkasan
Artikel ini membincangkan sebab nilai pembolehubah tidak betul berlaku dan menyediakan beberapa penyelesaian. Semasa menulis program Go, kita mesti memberi perhatian kepada skop pembolehubah, isu konkurensi dan isu penukaran jenis, untuk mengelakkan nilai pembolehubah yang salah.
Atas ialah kandungan terperinci Mengapakah nilai pembolehubah dalam program Go saya tidak betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!