天天看點

golang學習--關于defer的執行順序

執行個體一、

package main

import (
    "fmt"
)

func main() {
    defer_call()
}

func defer_call() {
    defer func() { fmt.Println("列印前") }()
    defer func() { fmt.Println("列印中") }()
    defer func() { fmt.Println("列印後") }()

    panic("觸發異常")
}
           

考點:defer執行順序 解答: defer 是後進先出。 協程遇到panic時,周遊本協程的defer連結清單,并執行defer。在執行defer過程中,遇到recover則停止panic,傳回recover處繼續往下執行。如果沒有遇到recover,周遊完本協程的defer連結清單後,向stderr抛出panic資訊。從執行順序上來看,實際上是按照先進後出的順序執行defer、

是以執行結果如下:

列印後
列印中
列印前
panic: 觸發異常
           

執行個體二、

package main

import (
	"fmt"
)

func calc(index string, a, b int) int {
    ret := a + b
    fmt.Println(index, a, b, ret)
    return ret
}

func main() {
    a := 1
    b := 2
    defer calc("1", a, calc("10", a, b))
    a = 0
    defer calc("2", a, calc("20", a, b))
    b = 1
}
           

考點:defer執行順序 解答: 這道題類似第1題 需要注意到defer執行順序和值傳遞 index:1肯定是最後執行的,但是index:1的第三個參數是一個函數,是以最先被調用calc(“10”,1,2)==>10,1,2,3 執行index:2時,與之前一樣,需要先調用calc(“20”,0,2)==>20,0,2,2 執行到b=1時候開始調用,index:2==>calc(“2”,0,2)==>2,0,2,2 最後執行index:1==>calc(“1”,1,3)==>1,1,3,4

是以執行結果是:

10 1 2 3
20 0 2 2
2 0 2 2
1 1 3 4
           

注意:這裡考了defer的執行順序,執行時參數的值,以及參數的執行順序。