英文:
Am I closing this function correctly?
问题
我在几个小时后一直收到一个错误,说我打开的文件太多。
我已经编辑了ulimit -n
,但这似乎只是延长了错误发生并导致进程崩溃的时间。
我相信我已经将问题缩小到这个函数,只是不确定我是否正确关闭它。
我目前有一个函数
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()
}()```
<details>
<summary>英文:</summary>
I keep getting an error after a few hours that I have too many open files.
I have already edited the ```ulimit -n``` but that only seems to prolong the time before the error occurs and crashes the process.
I believe I have narrowed it down to this function, I just am not sure if I am closing it right.
I currently have a function
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()
}()
I believe that it is hanging, so should I do this instead
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()
}()
</details>
# 答案1
**得分**: 1
使用`defer`语句,就像谷歌[建议][1]的那样:
```go
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)
}
英文:
use defer
statement like google advises:
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论