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