我正在和一位 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/

10-15 10:05