Чем := отличается от var и что такое затенение переменных?
- Почему 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 минут бесплатно.