Ответ
В Go существует несколько способов создания и инициализации map
:
-
Инициализация пустой
map
с помощьюmake
: Это наиболее распространенный способ создания пустой, готовой к использованиюmap
.m := make(map[string]int) m["apple"] = 1 fmt.Println(m) // Output: map[apple:1]
-
Инициализация
map
с начальными значениями (литералmap
): Позволяет создатьmap
и сразу заполнить её элементами.m := map[string]int{"a": 1, "b": 2} fmt.Println(m) // Output: map[a:1 b:2]
-
Объявление
map
без инициализации (nil
map
): Еслиmap
объявлена с помощьюvar
без последующей инициализацииmake
или литералом, она будетnil
. Вnil
map
нельзя добавлять элементы; попытка записи вызовет панику.var m map[string]int fmt.Println(m == nil) // Output: true // m["c"] = 3 // Это вызовет панику: assignment to entry in nil map
-
Создание
map
с указанием начального размера (ёмкости): Использованиеmake
с третьим аргументом (ёмкостью) может быть оптимизацией для большихmap
, если заранее известен приблизительный размер. Это позволяет Go выделить достаточно памяти заранее, уменьшая количество переаллокаций по мере добавления элементов.m := make(map[string]int, 100) // Создает map с начальной емкостью для 100 элементов m["large_key"] = 1000 fmt.Println(m)
-
Инициализация через
new
(редко используется дляmap
):new(map[string]int)
возвращает указатель наnil
map
. Это редко используется, так как для работы сmap
всё равно потребуется её инициализировать с помощьюmake
.mPtr := new(map[string]int) // mPtr теперь *map[string]int, указывающий на nil map fmt.Println(*mPtr == nil) // Output: true // Чтобы использовать map, нужно её инициализировать *mPtr = make(map[string]int) (*mPtr)["key"] = 42 fmt.Println(*mPtr) // Output: map[key:42]
В большинстве случаев предпочтительнее использовать
make
или литералmap
для создания и инициализацииmap
.