Apabila memulakan pembolehubah ralat global, ia mungkin kelihatan tidak berubah kepada fungsi dalam pakej yang sama. Percanggahan ini timbul daripada salah faham skop pembolehubah.
Dalam contoh pertama anda, anda menggunakan := untuk memulakan kedua-dua f dan loadErr dalam fungsi utama:
func main() { f, loadErr := os.Open("asdasd") if loadErr != nil { checkErr() } if f != nil { fmt.Println(f.Name()) } }
Barisan ini mencipta pembolehubah tempatan baharu untuk f dan loadErr. Ia tidak mengubah suai pembolehubah global yang ditakrifkan di luar fungsi. Oleh itu, apabila anda memanggil checkErr(), loadErr masih sifar kerana ia belum ditetapkan di mana-mana dalam skop fungsi utama.
Dalam contoh kedua anda, anda use = untuk menetapkan nilai loadErr kepada ralat yang dikembalikan oleh os.Open():
func main() { _, err := os.Open("asdasd") loadErr = err if loadErr != nil { checkErr() } }
Dengan menggunakan =, anda secara eksplisit memberikan nilai pembolehubah ralat tempatan kepada pembolehubah loadErr global. Ini membenarkan fungsi checkErr() untuk mengakses pembolehubah global yang diubah suai dan mencetuskan panik.
Untuk mengelakkan secara tidak sengaja mewujudkan pembolehubah tempatan yang membayangi pembolehubah global, adalah penting untuk mengisytiharkan pembolehubah global secara eksplisit sebelum memberikan nilai. Dalam contoh pertama, anda boleh mengisytiharkan loadErr sebagai pembolehubah global di luar fungsi utama dengan mengalihkan takrifnya:
var loadErr error func main() { _, loadErr = os.Open("asdasd") if loadErr != nil { checkErr() } if f != nil { fmt.Println(f.Name()) } }
Ini memastikan pembolehubah global loadErr boleh diakses dan dikemas kini sepanjang program.
Atas ialah kandungan terperinci Mengapa Ralat Global Saya Tidak Berubah Panik Selepas Permulaan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!