Получить доступ

Чем make отличается от new в Go?

JuniorСрезы, мапы и строки
Коротко

new(T) выделяет нулевое значение любого типа и возвращает указатель *T. make — только для срезов, мап и каналов: инициализирует их внутреннюю структуру и возвращает само значение (не указатель), готовое к работе.

  • make([]int, len, cap), make(map[K]V, hint), make(chan T, buf)
  • new(map[string]int) даёт указатель на nil-мапу — писать в неё нельзя
  • На практике new почти не используют: &T{} короче и позволяет задать поля

А ещё Где окажется значение — на стеке или в куче — решает компилятор, а не выбор make или new

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

p := new(int)          // *int, *p == 0
u := &User{Name: "a"}  // то же, что new + заполнение

s := make([]int, 0, 100)
m := make(map[string]int, 1000)   // подсказка ёмкости
ch := make(chan Event, 16)

Почему два встроенных. Срез, мапа и канал — дескрипторы, которым для работы нужны внутренние данные: массив, хеш-таблица, буфер и очередь ожидающих. Их нулевое значение — nil, и make создаёт рабочий экземпляр. Для остальных типов нулевое значение уже пригодно, и достаточно взять адрес.

Что хотят услышать

  • Что возвращает каждый и для каких типов.
  • Почему для срезов, мап и каналов нужен make.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем