Чем make отличается от new в Go?
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
Подробно
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.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗make возвращает указатель на любой тип
- ✗new(map[string]int) создаёт готовую к записи мапу, а make — лишь указатель на неё
- ✗make работает со структурами
- ✓new(T) — указатель на нулевое значение; make — для slice, map и chan
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.