gpt4 book ai didi

go - 需要帮助来理解 Go 语言中的垃圾收集

转载 作者:数据小太阳 更新时间:2023-10-29 03:37:50 24 4
gpt4 key购买 nike

我对 GoLang 的垃圾收集器有点困惑。

考虑以下代码,我在其中为我的类型 T 实现了阅读器接口(interface)。

type T struct {
header Header
data []*MyDataType
}

func (t *T) Read(p []byte) (int, error) {
t.Header = *(*Header) (t.readFileHeader(p))
t.Data = *(*[]*MyDataType) (t.readFileData(p))
}

在阅读器函数中,我将使用 unsafe.Pointer 将数据转换为 MyDataType,这将指向使用反射模块创建的 slice (这更复杂,但为了这个示例应该够了)

func (t *T) readFileData(data []byte, idx int, ...) unsafe.Pointer {
...
return unsafe.Pointer(&reflect.SliceHeader{Data : uintptr(unsafe.Pointer(&data[idx])), ...})
}

如果我要用不同的函数读取数据

func (d *Dummy) foo() {
data, _ := ioutil.ReadFile(filename)
d.t.Read(data) <---will GC free data?
}

现在我很困惑,如果可能的话,GC 会在退出 foo 函数后从文件中释放加载的数据。或者数据将在 d.t 被释放后被释放。

最佳答案

要了解 GC 可能对您的变量做什么,首先您需要知道 Go 如何以及在何处分配它们。这是一本关于 escape analysis 的好书,这就是 Go 编译器如何决定在堆栈或堆之间分配内存的方式。

长话短说,只有当你的 Go 程序没有引用内存时,GC 才会释放内存。

在您的示例中,data, _ := ioutil.ReadFile(filename) 对加载数据的引用被传递给 t.Data = *(*[]*MyDataType) ( t.readFileData(p)) 最终。因此,只要 (t *T) 结构也被引用,它们就会被引用。据我从您的代码中可以看出,加载的数据将与 (t *T) 一起被垃圾收集。

关于go - 需要帮助来理解 Go 语言中的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com