Ответ
make
— это встроенная функция в Go, предназначенная исключительно для инициализации трёх ссылочных типов: слайсов (slices), карт (maps) и каналов (channels).
Она не просто выделяет память, а инициализирует внутреннюю структуру данных, делая объект готовым к использованию.
Использование make
:
-
Слайсы:
// Слайс длиной 5 и емкостью 5 s1 := make([]int, 5) // Слайс длиной 5 и емкостью 10 s2 := make([]int, 5, 10)
-
Карты (Maps):
// Пустая карта m1 := make(map[string]int) // Карта с начальной емкостью для оптимизации m2 := make(map[string]int, 100)
-
Каналы:
// Небуферизированный (синхронный) канал ch1 := make(chan int) // Буферизированный канал на 10 элементов ch2 := make(chan int, 10)
Ключевое отличие от new
Основное различие заключается в том, что они создают и что возвращают.
new(T)
: Выделяет память для значения типаT
, инициализирует его нулевым значением этого типа и возвращает указатель на эту память (*T
).make(T, ...)
: Создает и инициализирует готовую к использованию структуру для слайсов, карт или каналов (типT
) и возвращает сам объект, а не указатель.
Сравнительная таблица:
Критерий | make |
new |
---|---|---|
Назначение | Инициализация слайсов, карт, каналов | Выделение памяти для любого типа |
Возвращаемое значение | Инициализированный объект (T ) |
Указатель на нулевое значение (*T ) |
Применение | Только для []T , map[K]V , chan T |
Для всех типов, включая структуры и примитивы |
Простое правило:
- Используйте
make
для слайсов, карт и каналов. - Используйте
new
для всего остального, когда вам нужен указатель на обнулённое значение.