Go имеет несколько способов выделения памяти и инициализации значения:
&T{...}
, &someLocalVar
, new
, make
Распределение также может происходить при создании составных литералов.
new
может использоваться для выделения значений, таких как целые числа, &int
недопустимо:
new(Point)
&Point{} // OK
&Point{2, 3} // Combines allocation and initialization
new(int)
&int // Illegal
// Works, but it is less convenient to write than new(int)
var i int
&i
Разницу между new
и make
можно увидеть, посмотрев на следующий пример:
p := new(chan int) // p has type: *chan int
c := make(chan int) // c has type: chan int
Предположим, что Go не имеет new
и make
, но имеет встроенную функцию NEW
. Тогда пример кода будет выглядеть так:
p := NEW(*chan int) // * is mandatory
c := NEW(chan int)
*
будет обязательным , поэтому:
new(int) --> NEW(*int)
new(Point) --> NEW(*Point)
new(chan int) --> NEW(*chan int)
make([]int, 10) --> NEW([]int, 10)
new(Point) // Illegal
new(int) // Illegal
Да, возможно объединение new
и make
в одну встроенную функцию. Тем не менее, вполне вероятно, что одна встроенная функция приведет к большей путанице среди новых программистов на Go, чем наличие двух встроенных функций.
Учитывая все вышеперечисленные пункты, представляется более целесообразным, чтобы new
и make
оставались отдельными.