Получить доступ

Чем := отличается от var и что такое затенение переменных?

JuniorОсновы языка
Ещё спрашивают так:
  • Почему err оказался nil после if в Go?
Коротко

:= — короткое объявление с выводом типа, только внутри функций; объявляет хотя бы одну новую переменную слева. var — работает и на уровне пакета, позволяет указать тип без значения. Затенение: := во вложенном блоке создаёт новую переменную с тем же именем, и внешняя остаётся неизменной.

  • x, err := f() — err может переиспользоваться, если x новая
  • Классическая ошибка: err := внутри if перекрывает внешний err
  • go vet -shadow и линтеры находят затенение

А ещё Неиспользуемая локальная переменная — ошибка компиляции

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Правила :=: слева хотя бы одна новая переменная в текущей области; остальные переиспользуются. Работает только внутри функций.

var нужен, когда: переменная на уровне пакета; нужен конкретный тип (var x int64 = 1); нужно нулевое значение без инициализации.

Затенение опасно тем, что компилятор не жалуется — переменная используется. Особенно часто это происходит с err и с переменными, инициализируемыми в if или for.

Пример

var cfg *Config
if path != "" {
    cfg, err := load(path)   // новые cfg и err в блоке if!
    if err != nil { return err }
    _ = cfg
}
// здесь внешний cfg всё ещё nil

// правильно:
var err error
if path != "" {
    cfg, err = load(path)
}

Что хотят услышать

  • Различия := и var.
  • Что такое затенение и пример ошибки.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем