В чем разница между nil-картой (map) и пустой картой в Go, и как их создать?

Ответ

Основное различие заключается в том, что 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-карта может быть полезна как возвращаемое значение из функции, чтобы показать отсутствие результата, или в структурах, где карта инициализируется позже при определенных условиях.