エラー変数をグローバルに初期化しようとすると、一部のユーザーは、変数が後続の関数で nil のままになるという不可解な問題に遭遇する可能性があります。同じパッケージを使用すると、予期しないプログラムの動作が発生します。この問題は、Go でのグローバル変数の初期化方法に起因します。
次の例の目的は、グローバル エラー変数loadErr を初期化し、別の関数 checkErr():
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) } }ただし、checkErr() がloadErr の nil 値を受け取るために問題が発生します。これは、main() で作成された変数 ("loadErr := os.Open('asdasd')") が main() 内のローカル変数であり、この時点ではグローバル変数が初期化されていないためです。この問題を解決するには、グローバルに値を割り当てるときに、宣言と初期化 (":=") の代わりに単純な代入 ("=") を使用する必要があります。変数:
// ... func main() { _, loadErr = os.Open("asdasd") // ^ Replaced := with = if loadErr != nil { checkErr() } // ... }「=」演算子を使用すると、グローバル変数loadErr`にエラー値が明示的に割り当てられ、パッケージ内の他の関数から確実にアクセスできるようになります。
以上がGo グローバル エラー変数が初期化後に nil のままになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。