顺序

defer被存储在栈结构中,注册defer函数对应入栈操作,执行defer函数对应出栈操作。

因此函数内的defer函数按照后入先出(LIFO)的顺序执行

用法

  1. 拦截panic,可以将程序从panic中recover回来
  2. 修改函数的命名返回值
  3. 输出调试信息
  4. 还原变量的旧值

注意

  1. defer函数中变量的求值时机是入栈时

  2. 结合上一点,使用匿名函数+闭包,正确传递变量值到defer函数中

     func foo2(){
       for i:=0;i<=3;i++{
         defer func(n){
           fmt.Println(n)
         }(i)
       }
     }
文章目录