контекст: Go, выделение памяти new: резервирует память с нулевой инициализацией для указанного типа и возвращает указатель make: инициализирует и возвращает готовые к применению слайсы, карты, каналы new → низкоуровневое выделение памяти без настройки структуры данных make → выполняет выделение памяти и настраивает внутренние поля типа использовать make со структурами и примитивными типами нельзя make требуется типам с внутренним состоянием и буферами — картам, слайсам и каналам на практике: new создаёт объект, а make инициализирует сложные встроенные типы, чтобы их можно было сразу использовать
В чём разница между new и make в Go?
контекст: Go, выделение памяти new: резервирует память с нулевой инициализацией для указанного типа и возвращает указатель make: инициализирует и возвращает готовые к применению слайсы, карты, каналы new →…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В чём разница между new и make в Go?
- контекст: Go, выделение памяти
- new: резервирует память с нулевой инициализацией для указанного типа и возвращает указатель
- make: инициализирует и возвращает готовые к применению слайсы, карты, каналы
- new → низкоуровневое выделение памяти без настройки структуры данных
- make → выполняет выделение памяти и настраивает внутренние поля типа
- использовать make со структурами и примитивными типами нельзя
- make требуется типам с внутренним состоянием и буферами — картам, слайсам и каналам
- на практике: new создаёт объект, а make инициализирует сложные встроенные типы, чтобы их можно было сразу использовать
Итог: new — выделение памяти и получение указателя; make — инициализация сложных встроенных типов.
Развёрнутый ответ
Основной ответ
В Go операторы new и make предназначены для создания и инициализации разных типов данных. new выделяет память под нулевое значение любого типа и возвращает указатель на него. make применяется только к срезам, картам и каналам и возвращает объект, уже подготовленный к работе.
Главные различия
- new(T): резервирует память под тип T и возвращает указатель
*T, содержащий нулевое значение этого типа. Область применения шире: оператор подходит для любых типов, в том числе для структур. - make(T, args): предназначен для создания и инициализации трёх встроенных типов —
slice,mapиchannel. Результатом становится уже инициализированное значение, необходимое для корректной работы; например, без make карта будет иметь значениеnil. - Иными словами, new лишь выделяет память и обнуляет её, не выполняя дополнительную настройку. make, напротив, подготавливает внутренние структуры данных, необходимые соответствующему типу.
Практическое применение
Когда требуется получить указатель на новую структуру, используют new, например p := new(MyStruct). Рабочий срез, карту или канал создают через make: для карты это выглядит так — m := make(map[string]int). В противном случае запись в карту вызовет panic. Это базовый паттерн работы с Go, особенно очевидный начиная с Go 1.0, и важная основа для понимания внутреннего устройства языка.