go lang struct指针将如何暗示所有权以及它与GC的关系

时间:2019-12-12 08:38:13

标签: go

我来自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中,此代码可以正确运行。那么这里发生了什么?

enter image description here

此图像来自Go教程,似乎没有new的本地var确实在堆栈中分配。然后很难理解该示例代码中发生了什么。编译器足够聪明,可以确定何时在堆栈中分配和何时在堆中分配?还是只要函数完成后堆栈就不会后退,只要有一个指针指向该堆栈段中的地址?

我应该如何理解Go中的ownership

0 个答案:

没有答案