執行個體一、
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的執行順序,執行時參數的值,以及參數的執行順序。