Go Lang的defer声明

Posted by: Thu Dec 15, 2016

很多新出的语言中都有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
    

参考资料

comments powered by Disqus