知识卡片
defer的延迟执行语义
内容
defer语句会立刻”记住”要执行的函数调用,但真正执行会推迟到包含这条defer语句的函数即将返回的那一刻——无论函数是正常return还是发生panic崩溃,被推迟的调用都保证会被执行。发散:这本质是把”资源获取”和”资源释放”的声明写在一起、但把释放的执行时机推迟到函数退出——比起在C语言里必须在每个错误分支手动插入清理代码,defer把”忘记清理”这类错误从人的责任转移成了语言机。
参考来源
- 位置:《Go语言程序设计》第1章《5个例子》(源文件:_epub-src/OEBPS/text00035.html)
- 结论依据:原文在该章节围绕“`defer`语句会立刻"记住"要执行的函数调用,但真正执行会推迟到包含这条defer语句的函数即将返回的那一…”给出定义、示例或限制条件;摘录中的术语、代码片段或对比关系直接支撑本卡片的结论。
- 原始内容:name != "" { if inFile, err = os.Open(inFilename); err != nil { log.Faal(err) } defer inFile.Close()❹ } if outFilename != "" { if outFile, err = os.Create(outFilename); e…