Вопрос с собеседования · Go

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

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

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

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

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

Подробно

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

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.
  • Что такое затенение и пример ошибки.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓:= объявляет новую переменную, затеняя внешнюю во вложенном блоке
  • ✗:= во вложенном блоке присваивает значение внешней переменной с тем же именем
  • ✗:= работает на уровне пакета
  • ✗var нельзя использовать внутри функций

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования