defer
defer 會在外層 function return 後才執行,但會記得當下defer的狀態
即使發生錯誤或panic,
defer
還是會執行
範例1:
package main
import "fmt"
func deferredFunc() {
fmt.Println("deferredFunc")
}
func main() {
defer deferredFunc()
fmt.Println("Hello, 世界")
}
範例2:
func a() {
i := 0
defer fmt.Println(i)
i++
return
}
如上的 defer 會在 a return 後印出 0
假設是 for 迴圈的 defer 則會推入類似 stack 內,先進後出
func b() {
for i := 0; i < 4; i++ {
defer fmt.Print(i)
}
}
印出 3 2 1 0
再來試著讀取回傳值的defer
package main
import (
"fmt"
)
func main() {
fmt.Println(c())
}
func c() (i int) {
defer func() { i++ }()
return 3
}
會印出4,因為 c 的 return 為 i
如果多個defer會相反方向執行
defer fmt.Println("1")
defer fmt.Println("2")
// 2 1
defer 會保留當下狀態
package main
import "fmt"
func main() {
i := 10
defer fmt.Println(i)
i++
fmt.Println(i)
}
// 11 10
Last updated
Was this helpful?