The introduction documents dedicate many paragraphs to explaining the difference between new() and make(), but in practice, you can create objects
Go has multiple ways of memory allocation and value initialization:
&T{...}, &someLocalVar, new, make
Allocation can also happen when creating composite literals.
new can be used to allocate values such as integers, &int is illegal:
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
The difference between new and make can be seen by looking at the following example:
p := new(chan int) // p has type: *chan int
c := make(chan int) // c has type: chan int
Suppose Go does not have new and make, but it has the built-in function NEW. Then the example code would look like this:
p := NEW(*chan int) // * is mandatory
c := NEW(chan int)
The * would be mandatory, so:
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
Yes, merging new and make into a single built-in function is possible. However, it is probable that a single built-in function would lead to more confusion among new Go programmers than having two built-in functions.
Considering all of the above points, it appears more appropriate for new and make to remain separate.