Сообщество RSS DEV

Перейти к основам: Почему nil Slices принимают новые значения, а nil Maps — нет

Применение новых значений к пустому срезу в Go работает как ожидается, но добавление новых значений в пустую карту вызывает ошибку во время выполнения. Пустой срез можно расширить, потому что он проверяет свою емкость и выделяет новый базовый массив, если это необходимо. Срез состоит из трех компонентов: указателя на базовый массив, длины среза и емкости среза. Когда объявляется пустой срез, его длина и емкость равны нулю, и он не указывает на базовый массив. Операция append выделяет новый массив и возвращает новый срез. С другой стороны, пустая карта в Go не инициализирована и не готова хранить пары ключ-значение. Это связано с тем, что карта действует как хеш-таблица, и ее внутренние структуры данных должны быть инициализированы сначала. Чтобы избежать ошибок во время выполнения, карта должна быть инициализирована с помощью функции make перед добавлением значений. Инициализация карты с помощью make позволяет ей хранить пары ключ-значение без ошибок. В отличие от пустых срезов, пустые карты требуют явной инициализации перед использованием. Это различие в поведении обусловлено внутренними структурами данных и тем, как они реализованы в Go. Понимание различий между срезами и картами имеет важное значение для написания эффективного и безошибочного кода на Go.
dev.to
Go Basics: Why nil Slices accept new values, but nil Maps don't