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