Функция `make` в Go: назначение и отличие от `new`

Ответ

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 для всего остального, когда вам нужен указатель на обнулённое значение.