Ответ
Встроенная функция make
используется в Go для инициализации (создания и выделения памяти) только трёх типов: слайсов, мапов и каналов.
В отличие от new
, которая выделяет память и возвращает указатель, make
возвращает инициализированный (не нулевой) объект указанного типа.
Аргументы make
зависят от типа:
-
Слайс (Slice):
make([]T, len, cap)
T
— тип элементов слайса.len
— начальная длина (количество элементов, заполненных нулевыми значениями своего типа).cap
(опционально) — ёмкость (общий размер выделенного участка памяти). Еслиcap
не указан, он равенlen
.
Пример:
// Слайс из 5 целых чисел с ёмкостью 10. // len(s) == 5, cap(s) == 10 s := make([]int, 5, 10)
-
Канал (Channel):
make(chan T, bufferSize)
T
— тип данных, передаваемых по каналу.bufferSize
(опционально) — размер буфера. ЕслиbufferSize
равен 0 или не указан, создаётся небуферизированный (синхронный) канал. Если больше 0 — буферизированный (асинхронный).
Пример:
// Небуферизированный канал для строк chSync := make(chan string) // Буферизированный канал на 3 элемента chAsync := make(chan string, 3)
-
Мапа (Map):
make(map[K]V, initialCapacity)
K
— тип ключа.V
— тип значения.initialCapacity
(опционально) — начальная ёмкость. Это подсказка для компилятора, позволяющая заранее выделить память под указанное количество элементов для оптимизации производительности. Это не ограничивает размер мапы, а помогает избежать лишних переаллокаций.
Пример:
// Мапа с предварительно выделенной памятью примерно на 100 элементов. m := make(map[string]int, 100)