Go におけるコンパイラの混乱: 宣言されているが使用されていない変数を理解する
Go では、コンパイラはコードの正確性を保証する上で重要な役割を果たします。ただし、場合によっては、「変数は宣言されているが使用されていない」など、一見不可解に見えるエラーにフラグを立てることがあります。この問題の根本原因を明らかにするために、具体的な例を詳しく調べてみましょう。
例: IO 操作で宣言されているが使用されていないエラー変数
を利用する次のコード スニペットを考えてみましょう。 io パッケージ:
func main() { readers := []io.Reader{ strings.NewReader("from string reader"), bytes.NewBufferString("from bytes reader"), } reader := io.MultiReader(readers...) data := make([]byte, 1024) var err error //var n int for err != io.EOF { n, err := reader.Read(data) fmt.Printf("%s\n", data[:n]) } os.Exit(0) }
コンパイラはエラーのフラグを立てます:「err」宣言され、使用されません。」ただし、コードでは for ステートメントで err 変数が使用されているため、このエラーは直観に反しているように見えます。
Go でのシャドウイングと変数宣言
問題を理解する鍵は次のとおりです。 for ループ内で := を使用する場合。この構文は、ループのスコープ内で新しい err 変数を宣言し、ループの外で宣言された元の err をシャドウします。その結果、コンパイラは元の err 変数を追跡しなくなり、「宣言されているが使用されていない」エラーが発生します。
問題の解決
問題を解決するには、ループ スコープ内で両方の err 変数を明示的に指定できます。
for var err error; err != io.EOF; { n, err := reader.Read(data) fmt.Printf("%s\n", data[:n]) }
または、次のようにすることもできます。ループ スコープに別の変数名 (loopErr:
for loopErr := err; loopErr != io.EOF; { n, loopErr := reader.Read(data) fmt.Printf("%s\n", data[:n]) }
など) を使用してシャドウイングの問題を回避します。シャドウイングの問題に対処することで、コンパイラ エラーが解消され、コードは意図したとおりに機能します。
以上がGo のコンパイラが、ループ内で使用されたエラー変数に対して「宣言されているが使用されていない」と報告するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。