2013-09-05 7 views
9

は私がgolangするnewbee、と私はIOパッケージをテストするためにプログラムを書く:golangコンパイラは、変数が宣言されていても使用されていないと思うのはなぜですか?

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文を誤って使用したと思います。なぜコンパイラはこのエラーを出力しますか?

+0

'n、err:= io.Copy(os.Stdout、io.MultiReader(readers ...)'および 'os.Exit(0)'を使って、 – Dustin

答えて

18

の中のerrは、の外にあるerrをシャドーイングしています(forの中のもの)。これは、短い変数宣言(:=演算子)を使用しているため、その変数の外側に宣言された変数をシャドウする新しいerr変数が宣言されているために発生します。

+1

シャドーイングが面倒です – Gustav

+0

':='短い宣言演算子は、複数の値で使用すると、少なくとも1つが宣言されていれば、宣言された変数に使用できます。この場合、前に宣言した 'err'を再利用しないのはなぜですか? – thomasrutter

+0

これらの宣言が異なるブロックになっているため、@thomasrutter – aromero

関連する問題