Maison > développement back-end > Golang > Pourquoi ma variable d'erreur globale reste-t-elle nulle après l'initialisation dans Go ?

Pourquoi ma variable d'erreur globale reste-t-elle nulle après l'initialisation dans Go ?

Barbara Streisand
Libérer: 2024-12-13 08:04:10
original
815 Les gens l'ont consulté

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

La variable d'erreur globale reste nulle après l'initialisation : découverte de l'écart

Considérez le code suivant :

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)
    }
}
Copier après la connexion

De manière perplexe , ce code ne panique pas, même si loadErr est nul. La même fonction checkErr() est définie pour paniquer lorsque loadErr n'est pas nul. Quelle est la cause de cet écart ?

Le mystère dévoilé

La racine du problème réside dans la distinction subtile entre les variables locales et globales. Dans le premier extrait de code, la ligne :

f, loadErr := os.Open("asdasd")
Copier après la connexion

crée une nouvelle variable loadErr locale dans le cadre de la fonction principale. Cette variable locale est distincte de la variable globale loadErr déclarée en dehors de toute fonction. En conséquence, le loadErr global reste intact et nul tout au long de l'exécution du code.

Résoudre l'écart

Pour rectifier le problème et s'assurer que le loadErr global est set, remplacez := par = dans la ligne mentionnée ci-dessus :

func main() {
    _, = os.Open("asdasd")
Copier après la connexion

Ce changement attribue la valeur de os.Open() directement au global loadErr, le définissant ainsi correctement à la valeur souhaitée.

Remarque supplémentaire

Si vous souhaitez conserver la valeur de f comme eh bien, prédéclarez f en dehors de la portée de la fonction :

var f *os.File

func main() {
    f, = os.Open("asdasd")
Copier après la connexion

Utiliser := dans ce cas créerait une variable f locale, éclipsant la variable globale un.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal