Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 我是否正确关闭此功能?_Go - Fatal编程技术网

Go 我是否正确关闭此功能?

Go 我是否正确关闭此功能?,go,Go,几个小时后,我一直收到一个错误,因为我打开的文件太多了 我已经编辑了ulimit-n,但这似乎只会延长错误发生和进程崩溃之前的时间 我相信我已经把它缩小到这个函数,我只是不确定我是否正确地关闭了它 我现在有一个功能 go func() { if _, err := io.Copy(rw, stdout); err != nil { if !WritePipeBroken.MatchString(err.Error()) && !Co

几个小时后,我一直收到一个错误,因为我打开的文件太多了

我已经编辑了
ulimit-n
,但这似乎只会延长错误发生和进程崩溃之前的时间

我相信我已经把它缩小到这个函数,我只是不确定我是否正确地关闭了它

我现在有一个功能

go func() {
    if _, err := io.Copy(rw, stdout); err != nil {
        if !WritePipeBroken.MatchString(err.Error()) &&
            !ConnectionResetByPeer.MatchString(err.Error()) {
            rollbar.Error(rollbar.ERR, err)
        }
        log.Printf("pipeThruFfmpegToMp3: %v\n", err)
        if err := ffmpeg.Process.Kill(); err != nil {
            log.Printf("pipeThruFfmpegToMp3: %v\n", err)
        }
    }
    rw.Flush()
    wg.Done()
}()
我相信它是挂着的,所以我应该这样做吗

go func() {
    if _, err := io.Copy(rw, stdout); err != nil {
        if !WritePipeBroken.MatchString(err.Error()) &&
            !ConnectionResetByPeer.MatchString(err.Error()) {
            rollbar.Error(rollbar.ERR, err)
        }
        log.Printf("pipeThruFfmpegToMp3: %v\n", err)
        if err := ffmpeg.Process.Kill(); err != nil {
            log.Printf("pipeThruFfmpegToMp3: %v\n", err)
        }
    }
    if ffmpeg.Process != nil {
        ffmpeg.Process.Kill()
    }
    if stdout != nil {
        stdin.Close()
    }
    rw.Flush()
    wg.Done()
}()

使用类似谷歌的
defer
语句:


rw
变量是什么?另外,
Copy
函数有两个参数-destination和source。您使用
stdout
作为源,这显然是错误的。rw是
rw web.ResponseWriter
,在这种情况下,我不确定使用
stdout
是错误的,因为我正在管道化应用程序,在这种情况下使用defer有更高的开销,因此,不确定只使用defer是否是正确的用例。@nadermx您指的是什么开销?没有理由为了节省几纳秒而让函数变得如此缓慢而复杂。这正是您应该使用defer的情况。
func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    defer src.Close()

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}