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 サイトの他の関連記事を参照してください。