Рассмотрим следующий пример, иллюстрирующий вопрос (он был создан только для того, чтобы пояснить вопрос, но я видел похожий код и в книгах, и в реальных проектах):
package main
import (
"strconv"
"fmt"
"log"
)
func main() {
n1, err := strconv.Atoi("1")
if err != nil {
log.Panicf("%v", err)
}
n2, err := strconv.Atoi("2")
if err != nil {
log.Panicf("%v", err)
}
// err := fmt.Errorf("new error") <- line 1
// n1, err := strconv.Atoi("3") <- line 2
fmt.Printf("n1 = %d, n2 = %d\n", n1, n2)
}
Компилятор не жалуется на переопределение err, но если я раскомментирую <- line 1 или <- line 2, он будет жаловаться no new variable on left side of :=.
Итак, как это работает? Почему компилятор с радостью позволяет переопределить err в операторе множественного возврата, используя :=, но не n1 в примере <- line 2?
Лучше, если вы можете указать на официальную ссылку, объясняющую это поведение.