我来自C ++ / Java,他们都对堆栈和堆有明确的规定,但是最近开始学习Go时我很困惑。
在C ++中,在堆栈上分配的本地var和在堆上分配的new
,在C ++ 11中,shared_ptr拥有所有权,而原始指针则没有。
在Java中,所有对象都分配在堆中,某种程度上类似于shared_ptr
我想用一个小例子来说明我的困惑:
package main
import "fmt"
type struct1 struct {
i1 int
}
func main() {
var pt = getstruct()
fmt.Printf("The int is: %d\n", pt.i1)
fmt.Println(pt)
}
func getstruct() *struct1 {
m := struct1{10}
return &m
}
在C ++中,显然这将导致分段错误,因为我们声明了局部变量并将其分配在堆栈中,然后在函数完成堆栈释放后返回其指针,这样指针将指向某个无效地址。但是在Go中,此代码可以正确运行。那么这里发生了什么?
此图像来自Go教程,似乎没有new
的本地var确实在堆栈中分配。然后很难理解该示例代码中发生了什么。编译器足够聪明,可以确定何时在堆栈中分配和何时在堆中分配?还是只要函数完成后堆栈就不会后退,只要有一个指针指向该堆栈段中的地址?
我应该如何理解Go中的ownership
?