ホームページ > バックエンド開発 > Golang > Go で初期化した後、グローバル エラー変数が nil のままになるのはなぜですか?

Go で初期化した後、グローバル エラー変数が nil のままになるのはなぜですか?

Barbara Streisand
リリース: 2024-12-13 08:04:10
オリジナル
815 人が閲覧しました

Why Does My Global Error Variable Remain Nil After Initialization in Go?

初期化後もグローバル エラー変数が 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート