← Назад к вопросам

Какие знаешь аргументы у make?

1.3 Junior🔥 151 комментариев
#Основы Go

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Аргументы функции make в Go

Функция make в Go используется для инициализации и создания встроенных ссылочных типов: срезов (slice), карт (map) и каналов (channel). В отличие от new, которая возвращает указатель на нулевое значение типа, make выполняет дополнительную внутреннюю инициализацию, необходимую для корректной работы этих структур данных. Аргументы make зависят от типа создаваемого объекта.

1. Создание среза (slice)

Для среза make принимает от двух до трёх аргументов:

// Сигнатура: make([]T, length, capacity)
slice1 := make([]int, 5)      // length = 5, capacity = 5
slice2 := make([]string, 3, 10) // length = 3, capacity = 10
  • Первый аргумент: тип среза (например, []int).
  • Второй аргумент: length (длина) — количество элементов, инициализированных нулевыми значениями типа. Это одновременно и текущая длина среза, доступная для индексации.
  • Третий аргумент (опциональный): capacity (ёмкость) — размер внутреннего массива, выделяемого под срез. Если не указан, равен length. Ёмкость определяет, сколько элементов можно добавить до переаллокации памяти.

Пример использования:

s := make([]int, 0, 100) // Пустой срез с запасом ёмкости под 100 элементов

2. Создание карты (map)

Для карты make принимает один или два аргумента:

// Сигнатура: make(map[K]V, initialCapacity)
map1 := make(map[string]int)     // Карта с начальной ёмкостью по умолчанию
map2 := make(map[int]bool, 100)  // Карта с предварительным выделением под 100 элементов
  • Первый аргумент: тип карты (например, map[string]int).
  • Второй аргумент (опциональный): initialCapacity (начальная ёмкость) — рекомендация по размеру внутренней хэш-таблицы. Go выделит память, достаточную для хранения указанного количества элементов, что может улучшить производительность при последующих добавлениях, избегая частых переаллокаций. Фактический размер может отличаться.

Важно: ёмкость карты не является ограничивающим фактором — карта может расти динамически.

3. Создание канала (channel)

Для канала make принимает один или два аргумента:

// Сигнатура: make(chan T, bufferSize)
ch1 := make(chan int)      // Небуферизованный канал
ch2 := make(chan string, 5) // Буферизованный канал с буфером на 5 элементов
  • Первый аргумент: тип канала (например, chan int).
  • Второй аргумент (опциональный): bufferSize (размер буфера) — количество элементов, которые канал может хранить без блокировки отправителя. Если аргумент опущен или равен 0, создаётся небуферизованный канал, где отправка и получение блокируют горутины до тех пор, пока не будет готов соответствующий отправитель или получатель.

Пример с буферизованным каналом:

ch := make(chan os.FileInfo, 100) // Канал с буфером для эффективной pipeline-обработки

Ключевые различия и рекомендации

  • Производительность: Указание capacity для срезов и initialCapacity для карт позволяет избежать затратных операций переаллокации при динамическом росте, особенно когда примерный размер данных известен заранее.
  • Поведение каналов: Размер буфера канала влияет на модель конкурентности программы. Небуферизованные каналы обеспечивают строгую синхронизацию, буферизованные — добавляют асинхронность.
  • Ограничения: make работает только с типами slice, map и chan. Попытка использовать с другими типами вызовет ошибку компиляции.

Итог

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

  • Срез: length (обязательно) и capacity (опционально).
  • Карта: initialCapacity (опционально).
  • Канал: bufferSize (опционально).

Понимание этих параметров критично для написания эффективного Go-кода, так как позволяет управлять памятью и поведением конкурентных программ на этапе инициализации.

Какие знаешь аргументы у make? | PrepBro