Rumah >pembangunan bahagian belakang >Golang >Mengapa Ralat Global Saya Tidak Berubah Panik Selepas Permulaan dalam Go?

Mengapa Ralat Global Saya Tidak Berubah Panik Selepas Permulaan dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-11 13:51:12250semak imbas

Why Doesn't My Global Error Variable Panic After Initialization in Go?

Mengapa Pembolehubah Ralat Global Tidak Panik Selepas Permulaan?

Apabila memulakan pembolehubah ralat global, ia mungkin kelihatan tidak berubah kepada fungsi dalam pakej yang sama. Percanggahan ini timbul daripada salah faham skop pembolehubah.

Skop dan Permulaan

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.

Menetapkan Pembolehubah Global

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.

Mengelakkan Membayangkan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn