Для каких типов используется функция `make` и в чем её отличие от `new`?

Ответ

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