1. 程式人生 > 實用技巧 >golang defer 以及 函式棧和return

golang defer 以及 函式棧和return

  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")}"