Go defer, panic, recover(四)

defer 關(guān)鍵字推遲其修飾的函數(shù)的執(zhí)行。該函數(shù)會(huì)在調(diào)用其的函數(shù)return之前按照先進(jìn)后出的方式依次執(zhí)行。
它比較適合于文件的打開,關(guān)閉操作。我們可以在文件打開命令的后面直接寫上個(gè)close語句,防止后面忘記。此時(shí)只需要將close語言用defer修飾即可。

for i := 3; i > 0; i--{
        defer func(n int){
            fmt.Print(n, ", ")
        }(i)
    }

上面這段代碼的輸出將會(huì)是1,2,3
因?yàn)槲覀冋{(diào)用了三次defer函數(shù),參數(shù)分別是3,2,1;而它是在函數(shù)最好執(zhí)行結(jié)束時(shí)按照后進(jìn)先出的順序執(zhí)行的,所以輸出就是1,2,3
defer有的類似java中的finally語句,即函數(shù)執(zhí)行結(jié)束后去執(zhí)行的語句塊。
panic() 類似java中的raise exception. 當(dāng)調(diào)用panic后程序?qū)?huì)拋出一個(gè)異常,進(jìn)而導(dǎo)致程序結(jié)束
recover() 類似java中的catch{}, 它會(huì)捕獲異常,進(jìn)而使程序從panic中恢復(fù),繼續(xù)往下運(yùn)行。

package main

import "fmt"

func a(){
    fmt.Println("Inside function a()")
    defer func(){
        if c := recover(); c != nil{
            fmt.Println(c)
            fmt.Println("Recover inside a!")
        }
    }()
    fmt.Println("call b")
    b()
    fmt.Println("call be finished")
    fmt.Println("exit a!")
}

func b()  {
    fmt.Println("inside b()")
    panic("Panic in b()")
    fmt.Println("exiting b()")
}

func main(){
    a()
    fmt.Println("exited main()")
}

所以通過defer, panic(), recover()三個(gè),我們就可以實(shí)現(xiàn)類似java代碼里面的try{}catch()finally{}行為

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容