Dans un programme Go, l'initialisation globale d'une variable d'erreur pose un problème particulier où elle reste nulle dans d'autres fonctions dans le même package. Pour percer ce mystère, examinons un exemple spécifique :
package main</p> <p>import (</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">"os" "fmt"
)
var loadErr erreur
func main() {
f, loadErr := os.Open("asdasd") if loadErr != nil { checkErr() } if f != nil { fmt.Println(f.Name()) }
}
// la panique ne sera pas appelée car loadErr est nul
func checkErr() {
if loadErr != nil { panic(loadErr) }
}
Dans ce scénario, vous vous attendez naturellement à ce que le code panique lorsque le fichier ne peut pas être ouvert. Cependant, contrairement aux attentes, il reste silencieux car la variable loadErr est nulle. Pour résoudre ce problème, une distinction cruciale doit être faite.
Dans Go, lors de l'utilisation de l'opérateur :=, une nouvelle variable locale est créée dans le cadre de la fonction. Dans ce cas, la ligne :
f, loadErr := os.Open("asdasd")
construit essentiellement une variable locale nommée loadErr, distincte à partir de la variable déclarée globalement. Malheureusement, la variable globale reste inchangée, ce qui conduit à l'énigme de la valeur nulle.
Pour remédier à ce problème, l'opérateur := doit être remplacé par l'opérateur d'affectation standard =. Cela garantit que la variable globale loadErr est référencée et initialisée avec la valeur renvoyée par os.Open():
func main() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">_, loadErr = os.Open("asdasd")
En effectuant ce changement subtil, la variable d'erreur globale est correctement définie, et la fonction panique se comportera désormais comme prévu.
De plus, si vous avez besoin de deux valeurs de retour de os.Open(), la deuxième variable utilisée dans l'affectation doit être explicitement déclarée au préalable :
var f *os .File<br>f, loadErr = os.Open("asdasd")<br>
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!