初期化後もグローバル エラー変数が nil のまま: 不一致の発見
次のコードを考えてみましょう:
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) } }
困惑、loadErr が指定されていても、このコードはパニックになりません。なし。同じ関数 checkErr() は、loadErr が nil でない場合にパニックするように定義されています。この不一致の原因は何ですか?
謎が明らかに
問題の根本は、ローカル変数とグローバル変数の微妙な違いにあります。最初のコード スニペットの行:
f, loadErr := os.Open("asdasd")
は、main 関数のスコープ内に新しいローカルのloadErr 変数を作成します。このローカル変数は、関数の外部で宣言されたグローバルなloadErrとは異なります。その結果、グローバルloadErrは、コードの実行中ずっとそのままでnilのままになります。
不一致の解決
問題を修正し、グローバルloadErrが確実に正常に実行されるようにするには、 set、上記の行の := を = に置き換えます:
func main() { _, = os.Open("asdasd")
この変更により、 os.Open()の値をグローバルloadErrに直接設定することで、目的の値に正しく設定できます。
補足
値を保持したい場合f の場合も同様に、関数スコープの外で f を事前宣言します:
var f *os.File func main() { f, = os.Open("asdasd")
この場合に := を使用すると、ローカル f が作成されます。変数は、グローバル変数を上回ります。
以上がGo で初期化した後、グローバル エラー変数が nil のままになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。