Go, память и инициализация make инициализирует срезы, карты и каналы создаёт внутреннюю структуру, не возвращая указатель на неё new выделяет память для любого типа и возвращает указатель на его нулевое значение make предназначена для типов со сложной внутренней организацией (срезов, map и chan) new применяют к примитивам и структурам, не выполняя инициализацию вложенного содержимого make выдаёт объект, готовый к использованию, а new — только память под него на практике make выбирают для структур данных, а new — для простых объектов Всего: 7 пунктов
Чем make отличается от new и что делает каждая функция в Go?
Go, память и инициализация make инициализирует срезы, карты и каналы создаёт внутреннюю структуру, не возвращая указатель на неё new выделяет память для любого типа и возвращает указатель на его нулевое значение make…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Чем 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 — специализированный и удобный способ контролируемого создания и инициализации сложных встроенных типов.