Pembolehubah Ralat Global Kekal Tiada Selepas Permulaan: Mendedahkan Percanggahan
Pertimbangkan kod berikut:
package main import ( "os" "fmt" ) var loadErr error func main() { f, loadErr := os.Open("asdasd") if loadErr != nil { checkErr() } if f != nil { fmt.Println(f.Name()) } } // panic won't be called because loadErr is nil func checkErr() { if loadErr != nil { panic(loadErr) } }
Membingungkan , kod ini tidak panik, walaupun loadErr adalah nil. Fungsi yang sama checkErr() ditakrifkan untuk panik apabila loadErr bukan nol. Apakah yang menyebabkan percanggahan ini?
Misteri Terbongkar
Punca isu terletak pada perbezaan halus antara pembolehubah tempatan dan global. Dalam coretan kod pertama, baris:
f, loadErr := os.Open("asdasd")
mencipta pembolehubah loadErr setempat baharu dalam skop fungsi utama. Pembolehubah tempatan ini berbeza daripada loadErr global yang diisytiharkan di luar mana-mana fungsi. Akibatnya, loadErr global kekal tidak disentuh dan tiada sepanjang pelaksanaan kod.
Menyelesaikan Percanggahan
Untuk membetulkan isu dan memastikan bahawa loadErr global adalah tetapkan, gantikan := dengan = dalam baris yang disebutkan di atas:
func main() { _, = os.Open("asdasd")
Perubahan ini memberikan nilai os.Open() terus kepada global loadErr, dengan itu menetapkannya dengan betul kepada nilai yang dikehendaki.
Nota Tambahan
Jika anda ingin mengekalkan nilai f juga, praisytiharkan f di luar skop fungsi:
var f *os.File func main() { f, = os.Open("asdasd")
Menggunakan := dalam kes ini akan buat pembolehubah f setempat, mengatasi pembolehubah global.
Atas ialah kandungan terperinci Mengapa Pembolehubah Ralat Global Saya Kekal Tiada Selepas Permulaan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!