Ответ
Основное различие заключается в том, что nil
-карта не инициализирована, и попытка записи в нее вызовет panic
, в то время как пустая карта инициализирована и готова к работе.
1. nil
-карта (map)
Это нулевое значение для типа map
. Переменная объявлена, но не указывает на какую-либо структуру данных в памяти.
- Создание:
var m1 map[string]int
- Свойства:
m1 == nil
вернетtrue
.- Чтение из
nil
-карты безопасно и всегда возвращает нулевое значение для типа значения (0
дляint
,""
дляstring
и т.д.). - Запись в
nil
-карту вызываетpanic
:m1["a"] = 1 // panic: assignment to entry in nil map
. - Встроенная функция
len()
дляnil
-карты вернет0
.
2. Пустая карта (map)
Это инициализированная карта, которая не содержит пар ключ-значение, но для нее выделена память, и она полностью готова к использованию.
-
Создание:
// С помощью make m2 := make(map[string]int) // С помощью литерала m3 := map[string]int{}
- Свойства:
m2 == nil
вернетfalse
.- В нее можно безопасно записывать и читать данные.
len(m2)
вернет0
.
Сводка и когда что использовать
Характеристика | nil -карта (var m ) |
Пустая карта (make или {} ) |
---|---|---|
Инициализация | Нет | Да |
Значение | nil |
Не nil |
Чтение | Безопасно (возвращает zero value) | Безопасно |
Запись | Panic! | Безопасно |
- Используйте пустую карту (
make
или{}
), когда вам нужно начать работать с картой: добавлять, удалять или читать элементы. Это самый частый случай. nil
-карта может быть полезна как возвращаемое значение из функции, чтобы показать отсутствие результата, или в структурах, где карта инициализируется позже при определенных условиях.