ホームページ > バックエンド開発 > Golang > Go でグローバル エラー変数の初期化が失敗するのはなぜですか?

Go でグローバル エラー変数の初期化が失敗するのはなぜですか?

Barbara Streisand
リリース: 2024-12-14 14:51:18
オリジナル
619 人が閲覧しました

Why Does Global Error Variable Initialization Fail in Go?

グローバル エラー変数の初期化エラー

Go プログラムでエラー変数をグローバルに初期化すると、エラー変数が nil のままになるという特有の問題が発生します。同じパッケージ内の他の機能。この謎を解明するために、具体的な例を詳しく見てみましょう:

package main</p>
<p>import (</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">"os"
"fmt"
ログイン後にコピー

)

varloadErrエラー

func main() {

f, loadErr := os.Open("asdasd")
if loadErr != nil {
    checkErr()
}
if f != nil {
    fmt.Println(f.Name())
}
ログイン後にコピー

}

//loadErr が nil であるため、パニックは呼び出されません
func checkErr() {

if loadErr != nil {
    panic(loadErr)
}
ログイン後にコピー

}

このシナリオでは、当然次のようなコードが予想されます。ファイルを開けないときにパニックに陥ります。ただし、予想に反して、loadErr 変数が nil であるため、沈黙したままになります。これを解決するには、重要な区別を行う必要があります。

Go では、:= 演算子を使用すると、関数のスコープ内に新しいローカル変数が作成されます。この場合、行:

f,loadErr := os.Open("asdasd")

は基本的に、loadErr という名前のローカル変数を構築します。グローバルに宣言された変数から。残念ながら、グローバル変数は影響を受けないため、nil 値という難問が生じます。

この問題を解決するには、:= 演算子を標準の代入演算子 = に置き換える必要があります。これにより、グローバル変数loadErr が参照され、os.Open():

func main() {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">_, loadErr = os.Open("asdasd")
ログイン後にコピー

この微妙な変更を加えることで、グローバル エラー変数が正しく設定され、パニック関数が次のように動作するようになります。

さらに、os.Open() から 2 つの戻り値が必要な場合は、代入で使用される 2 番目の変数を事前に明示的に宣言する必要があります:

var f *os .File<br>f、loadErr = os.Open("asdasd")<br>

以上がGo でグローバル エラー変数の初期化が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
前の記事:メインの Go ルーチンが終了すると、未完了のゴルーチンはどうなりますか? 次の記事:MongoDB および JSON マーシャリング用に Go 構造体で複数のタグを定義するにはどうすればよいですか?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート