go 语言文件操作:用 defer 关闭文件 | go 技术论坛-江南app体育官方入口
关闭文件的思考
假如我们在使用完文件后,不及时关闭,会发生什么?
在使用完文件(io)之后,正确的做法都是应该去关闭它,如果不关闭的话,就会使得程序本身所拥有的文件句柄一直增加,一直增加到某一个值之后,我们会发现程序已经没办法操作更多文件(too many open files),这中情况在web服务程序中稍不留神就出现,所以一定记住,对于文件io,用完一定要关闭。
在什么时机关闭文件比较好
在c语言中,我们常常都是在函数退出的时候去关闭,但是go给我们提供了一个关键字
defer
,可以使得我们在获取到文件操作句柄之后,就可以写defer filehandler.close()
, 这样也不怕写程序写到最后,忘记去关闭文件
浅谈defer
明确defer是在return之后,函数完全退出之前,如果一个代码块内出现多个defer,那么其是满足先进后出(filo)的执行顺序
func main(){ defer fmt.println("defer 1") defer fmt.println("defer 2") defer fmt.println("defer 3") fmt.println("defer test") } /*运行结果 defer test defer 3 defer 2 defer 1 */
defer关闭文件
示例代码
func main() {
filehandler, err := os.open("./test.txt")
if nil != err {
panic(err)
}
//检查完,发现没有错误,就可以关闭使用defer来关闭
defer func() {
err := filehandler.close()
if nil != err {
fmt.println("defer关闭文件失败:", err)
} else {
fmt.println("defer 关闭文件成功")
}
}()
}
运行结果
ps d:\gopractice\fileopt> go run .\main.go
defer 关闭文件成功