Apabila cuba untuk memulakan pembolehubah ralat secara global, sesetengah pengguna mungkin menghadapi isu yang membingungkan di mana pembolehubah kekal sifar dalam fungsi berikutnya dalam pakej yang sama, membawa kepada tingkah laku program yang tidak dijangka. Isu ini berpunca daripada cara pembolehubah global dimulakan dalam Go.
Dalam contoh berikut, matlamatnya ialah untuk memulakan pembolehubah ralat global loadErr dan menyemak ralat dalam fungsi checkErr():
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) } }
Walau bagaimanapun, isu timbul kerana checkErr() menerima nilai nil untuk loadErr. Ini kerana pembolehubah yang dicipta dalam main() ("loadErr := os.Open('asdasd')") ialah pembolehubah setempat dalam main(), dan pembolehubah global tidak dimulakan pada ketika ini.
Untuk menyelesaikan isu ini, seseorang harus menggunakan tugasan mudah ("=") dan bukannya pengisytiharan dan permulaan (":=") apabila memberikan nilai kepada global pembolehubah:
// ... func main() { _, loadErr = os.Open("asdasd") // ^ Replaced := with = if loadErr != nil { checkErr() } // ... }
Dengan menggunakan operator "=", pembolehubah global loadErr` secara eksplisit diberikan nilai ralat, memastikan ia boleh diakses oleh fungsi lain dalam pakej.
Atas ialah kandungan terperinci Mengapa Pembolehubah Ralat Global Go Saya Kekal Tiada Selepas Permulaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!