Чем nil-срез отличается от пустого и почему запись в nil-map вызывает panic?
nil-срез (var s []int) и пустой ([]int{}) оба имеют len 0, с обоими работают range и append. Различие — только s == nil и JSON: nil кодируется как null, пустой — как []. nil-map можно читать (нулевое значение), но запись — panic: у неё нет хеш-таблицы, куда писать.
- Возвращать из функций обычно nil-срез — это идиоматично
- Для API, где важно [] вместо null, — инициализировать явно
- map создают make(map[K]V) или литералом
А ещё len(nilMap) == 0, range по ней — ноль итераций
Подробно
var a []int // nil
b := []int{} // не nil, len 0
a = append(a, 1) // работает
var m map[string]int
_ = m["x"] // 0, без паники
m["x"] = 1 // panic: assignment to entry in nil map
Почему append работает с nil, а запись в map — нет. append возвращает новый срез и сам выделяет массив. Запись в мапу изменяет существующую структуру по указателю, а у nil-мапы её нет, и вернуть новую мапу оператор присваивания не может.
Поля структур. Структура с полем-мапой после var cfg Config имеет nil-мапу — конструктор или ленивая инициализация перед записью.
Что хотят услышать
- Сходство и различия nil и пустого среза.
- Почему nil-map паникует при записи.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗append к nil-срезу вызывает panic
- ✓nil-срез работает с append, а запись в nil-map — panic
- ✗nil-срез и пустой срез одинаково кодируются в JSON как пустой массив []
- ✗nil-map нельзя даже читать
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.