关于defer close()的问题

golang中的defer可以给我们编程带来很大的遍历,一些操作可以使用defer来防止不及时的关闭等

比如互斥锁、文件句柄、数据库连接等

比如一个文件操作:

func main() {
file, err := os.Open( "test.txt" )
if err != nil {
log.Println(err)
return
}
defer file.Close()
// ...
}

  

用GoLand等IDE的同学会经常注意到IDE给我们提示的一个信息:Unhandled error 

也就是说,file.Close()是有可能返回err的,但是我们并没有处理

虽然我们把file.Close()放到了函数最后执行,也不在乎它是不是返回错误,但是重要的不是错误本身,而是file没有按照我们的想法而关闭

但是由于其被写在了defer中,所以无法对错误进行处理

 

那么,对于文件操作,什么情况下才会file.Close()报错呢?

在defer file.Close()执行时,操作系统还未将数据刷到磁盘,这时我们应该收到错误提示,但是我们却忽略了这个错误

 

那么在特殊情况下的defer应该怎么写?

建议通过命名返回值和闭包来处理:

func fileClose() (err error) {
file, err := os.Open( "test.txt" )
if err != nil {
return err
}
defer func () {
closeErr := file.Close()
if err == nil {
err = closeErr
}
}()
_, err = io.WriteString(file, "hello golang" )
return
}

 

posted @   aganippe  阅读(702)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示