Этот вопрос проверяет понимание аллокации и инициализации встроенных типов в Go.
new(T) выделяет память под тип T, возвращает указатель *T с нулевым значением. make(T, args…) инициализирует и возвращает сам тип (не указатель) для срезов, мап и каналов: make([]T, len, cap), make(map[K]V, hint), make(chan T, size). Для других типов make неприменим, а new универсален.
Выделяет zero-инициализированный объект
Возвращает *T
p := new(int) // *int = 0Создаёт и инициализирует внутренние структуры
Возвращает значение типа:
make([]T, len, cap) → []T
make(map[K]V) → map[K]V
make(chan T, size) → chan T
Различия:
new не инициализирует сложные поля (len/cap, bucket), make — готовый к работе объект.
Пример:
m := new(map[string]int) // *map, но сам мап == nil, паника при записи
m2 := make(map[string]int) // готова к использованиюВывод:
Используйте make для срезов, мап и каналов, new — редко, для указателей на простые типы.