远飞闲记

阅读、思考、技术

Go Lang的defer声明

🗓️发布日期:2016-12-15 · 🗺️总字数: 487 字 · ⏱️阅读时间: 1 Minute

很多新出的语言中都有 defer 声明,比如:Go、Swift 等我所还不知道的编程语言,最近也特意的去研究了一下关于这个声明的用处和使用建议并在此记录一下,在 swift 和 go lang 中 defer 声明的用法及其概念都是一样的。

defer 简介

defer 语法声明就是延迟执行声明语句后所带的表达式或函数,主要是使用在函数返回以后对函数体内的某些变量或指针执行清理工作,比如:在一个函数内执行打开文件操作,但在调用 open 来获得对文件操作的指针以后,出现了 return 操作这时被打开的文件指针就在程序运行期间被一直未关闭,如果有了 defer 语句我们就可以在 open 以后 defer fp.close() 这样只要在函数返回后就会由执行 defer 语句后面的表达式,整体感觉有了这个声明后让我们的程序变的更简洁并且更可控了.

注意事项

  • 在使用 defer 获取函数里面变量的值时,变量值是获取的时候值,函数体以后对变量的操作和更改并不会 defer 里面该变量的值。
      import "fmt"
      func t(){
       i:=1
       defer fmt.Println(i)//最后返回的值是1,并不会是2
       i++
       return
      }
      t()
      //output: 1
  • 函数内可以有多个 defer 声明,它们的执行顺序是 LIFO(后进先出)的顺序来执行
         func t(){
            for i:=0;i<3;i++{
       defer fmt.Println(i)
            }
      return
         }
         t()
         //output: 2,1,0
  • 可以在 defer 语法声明后边调用执行另一个函数或匿名函数。
      func t(i *int){

        defer func(){ (*i)++ }()
      }

      i:=1
      t(&i)
      fmt.Println(i)
      //output: 2

参考资料

🏷️ Go