一、延遲是什么?
•即延遲( defer)陳述句,延遲陳述句被用于執行一個函式呼叫,在這個函式之前,延遲陳述句回傳,
一、延遲函式
1、可以在函式中添加多個defer陳述句,
•當函式執行到最后時,這些defer■陳述句會按照逆序執行,最后該函式回傳,特別是當你在進行一些打開資源的操作時,遇到錯誤需要提前回傳,在回傳前你需要關閉相應的資源,不然很容易造成資源泄露等問題
•如果有很多呼叫defer,那么defer是采用后進先出模式
•在離幵所在的方法時,執行(報錯的時候也會執行)

package mainimport "fmt"import ( "base")func main() { defer funcA() funcB() defer funcC() fmt.Println("main over...")}func funcA() { fmt.Println("這是funcA")}func funcB() { fmt.Println("這是funcB")}func funcC() { fmt.Println("這是funcC")}View Code
延遲方法(defe的資料結構類似于堆疊)

package mainimport "fmt"type person struct { firstName, lastName string}func (p person) fullName() { fmt.Printf("%s %s", p.firstName, p.lastName)}func main() { p := person{"Steven" , "Wang"} defer p.fullName() fmt.Print("Welcome ")}View Code
帶引數的defer函式

package mainimport "fmt"func main() { a := 5 b := 6 defer printAdd(a, b, true) a = 10 b = 7 printAdd(a, b, false)}func printAdd(a, b int, flag bool) { if flag { fmt.Printf("延遲執行函式printAdd() ,引數a,b分別為%d, %d , 兩數之和為:%d\n", a, b, a+b) } else { fmt.Printf("未延遲執行函式printAdd() ,引數a,b分別為%d, %d , 兩數之和為:%d\n", a, b, a+b) }}View Code
二、宕機panic和宕機恢復recover
(―)、panic和recover機制
1、概述:
• panic:詞義__恐慌recover:"恢復_■
• Go沒有像Java那樣的例外機制,它不能拋出例外,而是使用了 panic和recover機制,一定要記住,應當把它作為最后的手段來使用,也就是說,我們的代碼中應當沒有,或者很少有panic這樣的東西,
• go語言利用panicO, recover(),實作程式中的極特殊的例外處理
〇 panicO,讓當前的程式進入恐慌,中斷程式的執行
〇 recoverO,讓程式恢復,必須在defer函式中執行
〇 Panics—個內建函式,可以中斷原有的控制流程,進入一個令人恐慌的流程中,
〇當函式 F呼叫panic,函式 F的執行被中斷,但是F中的延遲函式會正常執行,然后F回傳到呼叫它的地方,在呼叫的地方,F的行為就像呼叫了panic,這一程序繼續向上,直到發生panic的goroutine中所有呼叫的函式回傳,此時程式退出,
〇恐慌可以直接呼叫panic產生,也可以由運行時錯誤產生,例如訪問越界的陣列,
〇 Recover是一個內建的函式,可以讓進入令人恐慌的流程中的goroutine恢復過來,
〇 recover僅在延遲函式中有效,在正常的執行程序中,呼叫recover會回傳nil,并且沒有其它任何效果,如果當前的goroutine陷入恐慌,呼叫recover•可以捕獲到panic的輸入值,并且恢復正常的執行

package mainimport "fmt"func main() { funcA() funcB() funcC() fmt.Println("main over")}func funcA() { fmt.Println("這是funcA")}func funcB() { defer func() { if msg := recover(); msg != nil { fmt.Println("恢復啦,獲取recover的回傳值:", msg) } }() fmt.Println("這是funcB") for i := 0; i < 10; i++ { fmt.Println("i:", i) if i == 5 { //panic("funcB恐慌啦") } }}func funcC() { defer func() { fmt.Println("執行延遲函式") msg := recover() fmt.Println("獲取recover的回傳值:", msg) }() fmt.Println("這是funcC") panic("funcC恐慌了")}View Code
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/65053.html
標籤:Go

