Для чего используется встроенная функция make в Go и какие у неё аргументы?

Ответ

Встроенная функция make используется в Go для инициализации (создания и выделения памяти) только трёх типов: слайсов, мапов и каналов.

В отличие от new, которая выделяет память и возвращает указатель, make возвращает инициализированный (не нулевой) объект указанного типа.

Аргументы make зависят от типа:

  1. Слайс (Slice):
    make([]T, len, cap)

    • T — тип элементов слайса.
    • len — начальная длина (количество элементов, заполненных нулевыми значениями своего типа).
    • cap (опционально) — ёмкость (общий размер выделенного участка памяти). Если cap не указан, он равен len.

    Пример:

    // Слайс из 5 целых чисел с ёмкостью 10.
    // len(s) == 5, cap(s) == 10
    s := make([]int, 5, 10)
  2. Канал (Channel):
    make(chan T, bufferSize)

    • T — тип данных, передаваемых по каналу.
    • bufferSize (опционально) — размер буфера. Если bufferSize равен 0 или не указан, создаётся небуферизированный (синхронный) канал. Если больше 0 — буферизированный (асинхронный).

    Пример:

    // Небуферизированный канал для строк
    chSync := make(chan string)
    
    // Буферизированный канал на 3 элемента
    chAsync := make(chan string, 3)
  3. Мапа (Map):
    make(map[K]V, initialCapacity)

    • K — тип ключа.
    • V — тип значения.
    • initialCapacity (опционально) — начальная ёмкость. Это подсказка для компилятора, позволяющая заранее выделить память под указанное количество элементов для оптимизации производительности. Это не ограничивает размер мапы, а помогает избежать лишних переаллокаций.

    Пример:

    // Мапа с предварительно выделенной памятью примерно на 100 элементов.
    m := make(map[string]int, 100)