拿代碼直接說明。
package main
import (
"fmt"
)
func main() {
//defer所在函數執行完所有的代碼之後,會自動執行defer的這個函數,可以說是析構函數,定義方式:defer function_name()
//給一個例子,獲取數組元素,處理數組訪問越界的問題。
a := [5]int{1, 2, 3, 4, 5}
for i := 0; i < 10; i++ {
item, ok := get(i, a)
fmt.Println("a[%d]=%d[%v]\n", i, item, ok)
}
//recover相當於try-catch的catch部分,使得panic不再傳遞。而defer相當於try-catch-final的final部分。
defer func() {
fmt.Println("a")
if err := recover(); err == nil {
fmt.Println("panic info is ", err)
}
}()
fmt.Println("b")
panic("test function t")
fmt.Println("c")
}panic要點:panic相當於一個運行時異常,遇到panic的時候,會停止當前函數剩下來的語句,但在退出該函數之前,會執行defer的語句,依據函數調用層次,panic依次終止每個函數,直至main()。
func get(i int, a [5]int) (ret int, ok bool) {
ok = true
defer func() {
err := recover()
if err != nil {
fmt.Println(err, "[ set to default value -1 ]")
ret = -1
ok = false
}
}()
ret = a[i]
return
}