Rumah >pembangunan bahagian belakang >Golang >Mengapa Pembolehubah Ralat Global Saya Kekal Tiada Selepas Permulaan dalam Go?

Mengapa Pembolehubah Ralat Global Saya Kekal Tiada Selepas Permulaan dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-13 08:04:10812semak imbas

Why Does My Global Error Variable Remain Nil After Initialization in Go?

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!

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