И make, и new используются для распределения, но для разных типов они служат разным целям.
-
new(T):
-
Выделяет память для переменной с нулевым значением типа T.
-
Возвращает указатель типа *T на выделенную память.
-
Используется для выделения памяти для любого типа, включая примитивные типы, структуры и массивы.
-
Пример: ptr := new(int) выделяет память для int, инициализированного 0, и возвращает указатель на него.
-
make(T, args):
-
Используется только для выделения и инициализации фрагментов, карт и каналов.
-
Инициализирует внутреннюю структуру данных (базовый массив для срезов, хеш-таблицу для карт, буфер для каналов).
-
Возвращает инициализированное (ненулевое) значение типа T (не указатель).
-
Пример: slice := make([]int, 5, 10) создает фрагмент целых чисел длиной 5 и емкостью 10. m := make(map[string]int) создает пустую карту. ch := make(chan string, 5) создает буферизованный канал.
-
Когда использовать:
-
Используйте new, когда вам нужен указатель на экземпляр любого типа с нулевым значением, особенно на структуры или примитивные типы, где вам нужно косвенно поделиться или изменить значение.
-
Используйте make, когда вам нужно инициализировать срезы, карты или каналы, поскольку он управляет настройкой внутренней структуры, необходимой для использования этих типов.
Итог
И make, и new используются для распределения, но для разных типов они служат разным целям.