Вопрос с собеседования · Go
Что такое нулевые значения в Go?
JuniorОсновы языка
Ещё спрашивают так:
- Чему равна неинициализированная переменная в Go?
Коротко
Любая переменная без явной инициализации получает нулевое значение своего типа: 0 для чисел, "" для строк, false для bool, nil для указателей, срезов, мап, каналов, функций и интерфейсов; у структуры — нулевые значения всех полей.
- Неинициализированных переменных в Go не бывает
- Хороший тип делают полезным в нулевом состоянии: sync.Mutex, bytes.Buffer работают без конструктора
- nil-срез можно читать и append; в nil-мапу писать нельзя — panic
А ещё Чтение из nil-мапы возвращает нулевое значение без паники
Подробно
var n int // 0
var s string // ""
var p *User // nil
var xs []int // nil, len 0
var m map[string]int // nil
var u User // все поля нулевые
Принцип «полезного нулевого значения». В стандартной библиотеке многие типы готовы к работе сразу после объявления:
var mu sync.Mutex
mu.Lock()
var buf bytes.Buffer
buf.WriteString("ok")
Различия nil-типов:
- nil-срез:
len= 0,rangeничего не делает,appendработает; - nil-мапа: чтение даёт нулевое значение, запись — panic;
- nil-канал: отправка и получение блокируются навсегда;
- nil-указатель: обращение к полю — panic.
Что хотят услышать
- Нулевые значения разных типов.
- Идея полезного нулевого значения.
- Поведение nil-срезов, мап и каналов.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Неинициализированная переменная содержит мусор из памяти
- ✗Нулевое значение строки и среза — nil, а структуры без инициализации тоже равны nil
- ✗Структуры без инициализации равны nil
- ✓Без инициализации — нулевое значение типа: 0, "", false, nil
Связанные вопросы
Партнёр платформы
Разбор собеседования
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.