2013-09-05 4 views
9

Я Newbee к golang, и я пишу программу для тестирования 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 err. Почему компилятор выводит эту ошибку?

+0

Вы также можете удалить почти весь этот код, просто используя 'n, err: = io.Copy (os.Stdout, io.MultiReader (reader ...)' (и 'os.Exit (0)' в конце не нужно) – Dustin

ответ

18

err внутри для затенения err снаружи, и он не используется (тот, который находится внутри). Это происходит потому, что вы используете короткую декларацию переменной (с оператором :=), которая объявляет новую переменную err, которая затеняет значение, объявленное за пределами for.

+1

Тенерирование сложно. – Gustav

+0

У меня создалось впечатление, что оператор короткой декларации ': =', когда используется для нескольких значений, позволяет использовать некоторые из них для предварительно объявленных переменных, если хотя бы один из них был но в этом случае он не повторяет ранее объявленное «err», если это так? – thomasrutter

+0

@thomasrutter, потому что эти объявления находятся в разных блоках. – aromero

Смежные вопросы