07 Типы и значения
Чем := отличается от обычного присваивания?
Ответ
:= объявляет хотя бы одну новую переменную в текущем блоке и сразу даёт ей значение. = только записывает в уже существующие имена. Повторное := во вложенном if легко создаёт новые переменные с теми же именами и прячет внешние.
Подробнее
В примере внутренние n и err живут только внутри if. Снаружи остаются n == 10 и err == nil, хотя разбор строки "нет" завершился ошибкой.
Если нужно обновить те же переменные, пиши n, err = strconv.Atoi(...) — одно равно, без двоеточия.
package main
import (
"fmt"
"strconv"
)
func main() {
n, err := strconv.Atoi("10")
if err != nil {
panic(err)
}
if n, err := strconv.Atoi("нет"); err != nil {
fmt.Println("внутри if:", err)
fmt.Println("внутренний n:", n)
}
fmt.Println("снаружи n =", n, "err =", err)
}