我正在和一位 friend 争论,讨论Go中可能浪费的资源。
如果Reader在内存中的字节数组上运行,是否必须将其关闭?
func readJar(zipBytes []byte, readMeta bool) (m jar.Manifest, err error) {
reader, err := zip.NewReader(bytes.NewReader(zipBytes), int64(len(zipBytes)))
if err != nil {
return
}
for _, file := range reader.File {
switch file.Name {
case jar.ManifestPath:
m, err = readManifest(file)
if err != nil {
return
}
}
}
return
}
func readManifest(file *zip.File) (jar.Manifest, error) {
reader, err := file.Open()
if err != nil {
return nil, err
}
defer reader.Close()
return jar.ReadManifest(reader)
}
最初它被认为是文件句柄泄漏的来源,但其他原因也应归咎于此。
这个泄漏内存还是Go可以进行足够的转义分析/垃圾回收?
最佳答案
Golang编译器负责unreachable variables:-
虽然Golang包含垃圾回收。最好使用清理功能。您可以使用defer函数在函数末尾关闭文件。
defer f.close()
检查文档SetFinalizer以获得对这些概念的更多理解:
func SetFinalizer(obj interface{}, finalizer interface{})
终结器运行一个对象,以检查该对象是否无法从源到达。它可以用于文件描述符,但是依靠终结器来刷新内存中的I/O缓冲区(例如bufio.Writer)将是一个错误,因为该缓冲区不会在程序退出时被刷新。
关于go - 是否需要关闭zip.NewReader(bytes.NewReader(),len)或自动垃圾回收?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51261162/