golang new() 与结构体字面量的区别,尤其是在内存分配方面

Hel*_*ang 7 go

说我有一个结构:

type foo struct {
}
Run Code Online (Sandbox Code Playgroud)

之间有什么区别吗

f := &foo{}
Run Code Online (Sandbox Code Playgroud)

f := new(foo)
Run Code Online (Sandbox Code Playgroud)

就它被编译成的机器代码而言,还是仅仅是语法上的差异?

一个更具体的问题:

至于structliteral( &foo{}),内存可以在栈中分配,也可以在堆中分配,取决于转义分析。

但是对于new(foo),我不太确定:

calloc()new()根据我的理解,在 c 中类似于在 golang 中。但calloc()总是在堆上分配。我想知道是否new()总是在堆中分配?

golang 规范(https://golang.org/ref/spec#Allocation)只提到:

内置函数 new 接受类型 T,在运行时为该类型的变量分配存储空间,并返回指向它的类型 *T 的值。变量按照初始值部分中的描述进行初始化。

它没有说明new()将在哪里分配内存。所以new()总是在堆上分配,还是也可以在堆栈中分配——与内存分配中的结构体完全相同?