我看到一些代码示例中有这样的结构:
type point struct {
x, y int
}
func newPoint() *point {
return &point{10, 20}
}
我有C++的背景,但这对我来说似乎是一个错误。这种结构的语义是什么?新点分配在堆栈还是堆上?
我看到一些代码示例中有这样的结构:
type point struct {
x, y int
}
func newPoint() *point {
return &point{10, 20}
}
我有C++的背景,但这对我来说似乎是一个错误。这种结构的语义是什么?新点分配在堆栈还是堆上?
Go语言执行指针逃逸分析。如果指针逃逸出本地堆栈,就像在这种情况下一样,对象将分配到堆上。如果它没有逃逸出本地函数,则编译器可以自由地将其分配到栈上(尽管它不作任何保证;这取决于指针逃逸分析是否能够证明指针仍然局限于本函数)。
Golang的文档指出,返回指向本地变量的指针是完全合法的。就像我在这里读到的:
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/EYUuead0LsY
看起来编译器会将你返回的地址放在堆上。这在Go语言中是一种常见的惯用法。