关于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 }
分类:
golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理