Чем make отличается от new и что делает каждая функция в Go?

Go, память и инициализация make инициализирует срезы, карты и каналы создаёт внутреннюю структуру, не возвращая указатель на неё new выделяет память для любого типа и возвращает указатель на его нулевое значение make…

Короткий ответ

Что ответить на собеседовании

Go, память и инициализация make инициализирует срезы, карты и каналы создаёт внутреннюю структуру, не возвращая указатель на неё new выделяет память для любого типа и возвращает указатель на его нулевое значение make предназначена для типов со сложной внутренней организацией (срезов, map и chan) new применяют к примитивам и структурам, не выполняя инициализацию вложенного содержимого make выдаёт объект, готовый к использованию, а new — только память под него на практике make выбирают для структур данных, а new — для простых объектов Всего: 7 пунктов

Подробный разбор

Ответ с пояснениями

Чем make отличается от new и что делает каждая функция в Go?

Go, память и инициализация

  • make инициализирует срезы, карты и каналы
  • создаёт внутреннюю структуру, не возвращая указатель на неё
  • new выделяет память для любого типа и возвращает указатель на его нулевое значение
  • make предназначена для типов со сложной внутренней организацией (срезов, map и chan)
  • new применяют к примитивам и структурам, не выполняя инициализацию вложенного содержимого
  • make выдаёт объект, готовый к использованию, а new — только память под него
  • на практике make выбирают для структур данных, а new — для простых объектов Всего: 7 пунктов

Подробный ответ

Основной ответ

В Go функция make служит для выделения памяти и инициализации встроенных типов данных — срезов (slices), карт (maps) и каналов (channels). Она создаёт сам объект вместе с необходимой внутренней структурой, поэтому результат можно использовать сразу. Оператор new, напротив, выделяет память под значение типа и возвращает указатель на его нулевое значение, но не выполняет инициализацию внутренних структур.

Ключевые моменты

  • С помощью make создаются полноценные экземпляры встроенных коллекций: для среза выделяется массив, а для map или канала подготавливаются соответствующие внутренние указатели и структуры.
  • Вызов new(T) выделяет память под нулевое значение типа T и возвращает указатель *T. Дополнительной инициализации при этом не происходит, поэтому map или slice, полученные через new, останутся nil, а вызов методов на них приведёт к панике.
  • Функция make не предназначена для обычных структур и пользовательских типов: её область применения — встроенные коллекции. Оператор new, напротив, является универсальным и работает с любыми типами.

Практический контекст

В Go 1.18+ обычно применяют make, когда нужно создать срез с определёнными длиной и вместимостью, например make([]int, 0, 10), либо инициализировать канал make(chan int, 5). Для структур чаще используют литералы (&T{}) или new, если требуется нулевой объект в виде указателя без дополнительной инициализации. Итак, make — специализированный и удобный способ контролируемого создания и инициализации сложных встроенных типов.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку