Выбор ответа Middle Типы и нулевые значения спрашивают часто обновлено

Затенение переменной через :=

Вопрос

Что выведет код?

var err error
if true {
    n, err := strconv.Atoi("x")
    _ = n
    _ = err
}
fmt.Println(err)

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: <nil. Внутри блока if оператор := создаёт новые переменные n и err, которые затеняют внешнюю err.

Варианты ответа

  1. <nil>правильный ответ
  2. strconv.Atoi: parsing "x": invalid syntax
  3. Ошибка компиляции: err объявлена дважды
  4. 0

Разбор

Внутри блока if оператор := создаёт новые переменные n и err, которые затеняют внешнюю err. Ошибка разбора попадает во внутреннюю переменную, а печатается внешняя, которая так и осталась nil. Компилятор не жалуется: это разные области видимости (линтеры вроде govet shadow ловят такое). Исправление: n, err = strconv.Atoi("x") с заранее объявленной n.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме