Globale Fehlervariable bleibt nach der Initialisierung Null: Aufdecken der Diskrepanz
Bedenken Sie den folgenden Code:
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) } }
Verwirrend , gerät dieser Code nicht in Panik, auch wenn LoadErr gleich Null ist. Die gleiche Funktion checkErr() ist so definiert, dass sie in Panik gerät, wenn loadErr nicht Null ist. Was verursacht diese Diskrepanz?
Das gelüftete Geheimnis
Die Wurzel des Problems liegt in der subtilen Unterscheidung zwischen lokalen und globalen Variablen. Im ersten Codeausschnitt erstellt die Zeile:
f, loadErr := os.Open("asdasd")
eine neue, lokale LoadErr-Variable im Rahmen der Hauptfunktion. Diese lokale Variable unterscheidet sich vom globalen LoadErr, der außerhalb einer Funktion deklariert wird. Infolgedessen bleibt der globale LoadErr während der gesamten Ausführung des Codes unberührt und gleich Null.
Auflösen der Diskrepanz
Um das Problem zu beheben und sicherzustellen, dass der globale LoadErr vorhanden ist setze, ersetze := durch = in der oben genannten Zeile:
func main() { _, = os.Open("asdasd")
Diese Änderung weist den Wert von zu os.Open() direkt zum globalen LoadErr und setzt ihn dadurch korrekt auf den gewünschten Wert.
Zusätzlicher Hinweis
Wenn Sie den Wert von f as beibehalten möchten Nun, deklarieren Sie f außerhalb des Funktionsumfangs vor:
var f *os.File func main() { f, = os.Open("asdasd")
Die Verwendung von := würde in diesem Fall eine lokale f-Variable erstellen und die in den Schatten stellen global.
Das obige ist der detaillierte Inhalt vonWarum bleibt meine globale Fehlervariable nach der Initialisierung in Go Null?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!