Golang Defer 的使用有什么用?

发布时间:2021-09-23

  一开始我是不知道defer 的使用 在开始使用 Go 进行编码时,Defer 是要关注的一个很重要的特性。它非常简单:在任何函数中,给其他函数的调用加上前缀 defer 以确保该函数在外部函数退出之前立即执行,即使外部函数出现异常被中断,该延迟函数也将运行。

  但是,你还可以使用 defer 在任何函数开始后和结束前执行配对的代码。这个隐藏的功能在网上的教程和书籍中很少提到。要使用此功能,需要创建一个函数并使它本身返回另一个函数,返回的函数将作为真正的延迟函数。

  1.在 defer 语句调用父函数后在其上添加额外的括号来延迟执行返回的子函数

  

  

  

  输出结果!

  

  

  

  2.父函数返回的函数将是实际的延迟函数。父函数中的其他代码将在函数开始时(由 defer 语句放置的位置决定)立即执行。

  这为开发者提供了什么能力?因为在函数内定义的匿名函数可以访问完整的词法环境(lexical environment),这意味着在函数中定义的内部函数可以引用该函数的变量。在下一个示例中看到的,参数变量在 measure 函数第一次执行和其延迟执行的子函数内都能访问到:

  

  

  

  输出结果:

  

  

  

  函数命名的返回值也是函数内的局部变量,所以上面例子中的 measure 函数如果接收命名返回值作为参数的话,

  那么命名返回值在延迟执行的函数中也能访问到,这样就能将 measure 函数改造成记录入参和返回值的工具函数。

  可以想象,将代码延迟在函数的入口和出口使用是非常有用的功能,尤其是在调试代码的时候。

注册即送1000元现金券