Ответ
Встроенная функция make используется для инициализации и выделения памяти только для трёх встроенных типов:
-
Срезы (slices):
make([]T, len, cap)Создаёт срез, выделяя память под базовый массив и инициализируя дескриптор среза (указатель, длину и ёмкость).s := make([]int, 5, 10) // len=5, cap=10 -
Карты (maps):
make(map[K]V, initialCapacity)Создаёт и инициализирует хэш-таблицу для хранения пар ключ-значение.m := make(map[string]int, 100) -
Каналы (channels):
make(chan T, bufferSize)Создаёт канал для коммуникации между горутинами и, если указано, выделяет буфер.ch := make(chan int, 10)
Ключевое отличие make от new
| Характеристика | make(T, ...) |
new(T) |
|---|---|---|
| Назначение | Инициализация срезов, карт и каналов | Выделение памяти для любого типа |
| Возвращаемое значение | Значение типа T (например, []int) |
Указатель на тип *T (например, *int) |
| Результат | Возвращает инициализированный, готовый к использованию объект | Возвращает указатель на обнулённую (zeroed) область памяти |
Итог: make создаёт и настраивает сложные внутренние структуры (хэш-таблицы, буферы), а new просто выделяет "сырую" обнулённую память и возвращает указатель на неё.