In einem Go-Programm stellt die globale Initialisierung einer Fehlervariablen ein besonderes Problem dar, bei dem sie Null bleibt andere Funktionen innerhalb desselben Pakets. Um dieses Rätsel zu lösen, schauen wir uns ein konkretes Beispiel an:
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 Fehler
func main() {
f, loadErr := os.Open("asdasd") if loadErr != nil { checkErr() } if f != nil { fmt.Println(f.Name()) }
}
// Panic wird nicht aufgerufen, da LoadErr Null ist
func checkErr() {
if loadErr != nil { panic(loadErr) }
}
In diesem Szenario würden Sie natürlich erwarten, dass der Code in Panik gerät, wenn die Datei dies nicht kann geöffnet werden. Entgegen den Erwartungen bleibt es jedoch stumm, da die Variable „loadErr“ gleich Null ist. Um dieses Problem zu lösen, muss eine entscheidende Unterscheidung getroffen werden.
In Go wird bei Verwendung des :=-Operators eine neue lokale Variable im Rahmen der Funktion erstellt. In diesem Fall erstellt die Zeile:
f, loadErr := os.Open("asdasd")
im Wesentlichen eine lokale Variable mit dem Namen „loadErr“, eindeutig aus der global deklarierten Variablen. Leider bleibt die globale Variable davon unberührt, was zum Nullwert-Rätsel führt.
Um dieses Problem zu beheben, muss der Operator := durch den Standardzuweisungsoperator = ersetzt werden. Dadurch wird sichergestellt, dass die globale Variable loadErr mit dem von os.Open() zurückgegebenen Wert referenziert und initialisiert wird:
func main() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">_, loadErr = os.Open("asdasd")
Durch diese subtile Änderung wird die globale Fehlervariable korrekt eingestellt und die Panikfunktion verhält sich nun wie folgt vorgesehen.
Falls Sie außerdem zwei Rückgabewerte von os.Open() benötigen, muss die zweite in der Zuweisung verwendete Variable vorher explizit deklariert werden:
var f *os .File<br>f, loadErr = os.Open("asdasd")<br>
Das obige ist der detaillierte Inhalt vonWarum schlägt die Initialisierung globaler Fehlervariablen in Go fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!