bigwhite / GoProgrammingFromBeginnerToMaster

Go语言精进之路书籍配套代码
Apache License 2.0
247 stars 82 forks source link

关于defer的问题 #3

Closed TanHaodong closed 2 years ago

TanHaodong commented 2 years ago

问题在:deferred_func_2.go 原文: f, err := os.OpenFile(fname, os.O_RDWR, 0666) if err != nil { return err } defer f.Close()
改后: f, err := os.OpenFile(fname, os.O_RDWR, 0666) defer f.Close() // 这里 if err != nil { return err }

bigwhite commented 2 years ago

为啥在不判断OpenFile的返回值的情况下就调用defer f.Close呢?能说说你的理由不?

TanHaodong commented 2 years ago

为啥在判断OpenFile的返回值的情况下就调用defer f.Close呢?能说出你的不?

在博客圆:https://www.cnblogs.com/sinclairni/p/15126506.html。以前好像在那个视频里也看到过。return之后,会发生泄露。defer 没有出栈吧。能详细讲下吗?自己学的知识深度不够

bigwhite commented 2 years ago

OpenFile调用返回失败时,说明文件打开并没有成功,即文件描述符等资源并没有申请成功,所以不存在泄露问题。

TanHaodong commented 2 years ago

谢谢