defer 作为延迟函数存在,在函数执行结束时才会正式执行,一般用于资源释放等操作

  参考一段代码https://mp.weixin.qq.com/s/yfH0CBnUBmH0oxfC2evKBA来分析defer 函数压栈操作

package def_test

import (
  "fmt"
  "testing"
)

func GetFn() func() {
  fmt.Println("outside")
  return func() {
    fmt.Println("Inside")
  }
}

func TestDefer(t *testing.T) {
  defer GetFn()()
  fmt.Println("Here")
}

  这里实际输出顺序为 

outside
Here
Inside

  

原因在于在当执行代码时,当运行到 "defer GetFn()()"这一行代码时,由于defer作为延迟函数存在独立的栈,需要将GetFn()()方法压入栈中;对于GetFn()()而言这个方法实际是先获取GetFn()方法返回的函数,对返回的函数再次执行;
因此对于defer 栈中实际入栈的是GetFn()返回的方法,为了得到返回的函数,因此在执行入栈操作之前先执行了GetFn()函数,输出打印了"outside"
代码继续往下执行 "fmt.Println("Here")", 由于defer作为延迟函数存在,在函数正式返回之前才会正式执行defer已入栈的函数"func() {    fmt.Println("Inside")}"