golang基礎--細說defer

來源:互聯網
上載者:User

defer 匿名函數特性

  • 執行方式類似其它語言中的解構函式,在函數體執行結束後按照調用順序的相反順序逐個執行

    //執行順序相反package mainimport "fmt"func main() {    fmt.Println("a")    defer fmt.Println("b")    defer fmt.Println("c")}/*輸出acb*/
  • 即使函數發生嚴重的錯誤也會執行,類似於try...except
  • 常用於 資源清理,檔案關閉,解鎖以及記錄時間等操作

  • 支援匿名函數的調用
  • 通過於匿名函數配合可在return之後修改Function Compute的結果
    -如果函數體內某個變數作為defer時匿名函數的參數,則在定義defer時即已經獲得了拷貝,否則 則時引用某個變數的地址

    //支援匿名函數package mainimport "fmt"func main() {    for i := 0; i < 3; i++ {        defer func() { //函數體內的變數傳遞到defer匿名函數            fmt.Println(i) //此時引用的時變數i的地址        }()    }}/*輸出333*/
  • Go沒有異常機制,但有panic/recover模式來處理錯誤
  • Panic可以在任何地方引發

    panic錯誤機制

    //panic 錯誤機制,遇到panic語句後,後面不會再執行package mainimport "fmt"func main() {    A()    B()    C()}func A() {    fmt.Println("func a")}func B() {    panic("Panic B")}func C() {    fmt.Println("func")}/*輸出A()-->  func aB()---> panic: Panic B---------------    goroutine 1 [running]:    main.B()C()     C:/Users/faily/Desktop/workspace/src/defer1.go:17 +0x40    main.main()        C:/Users/faily/Desktop/workspace/src/defer1.go:8 +0x2c    exit status 2    exit status 1*/
  • defer,配合recover及匿名函數處理常式出現的嚴重錯誤(panic語句),調過程式錯誤,繼續執行,類似於python語言中 try...except,finally語句.

    //defer,recover機制,處理panic引發的機制package mainimport "fmt"func main() {    A()    B()    C()}func A() {    fmt.Println("func a")}func B() {    defer func() {                          //defer函數放在panic之前        if err := recover(); err != nil {   //註冊recover函數(判斷是否觸發panic錯誤),並判斷            fmt.Println("Recover in B")     //如果程式出現panic,並且err不為nil(真實存在)        }     }()                                     //記住,defer的匿名函數大括弧後要加上()                                    panic("Panic B")                        //跳過程式錯誤,繼續後面的執行。}func C() {    fmt.Println("func C")}/*輸出A()-->  func aB()-->  Recover in BC()-->  func C*/ 

    ~~留一個問題,感興趣的小夥伴歡迎作答

    運行以下代碼,並分析輸出結果

    package mainimport "fmt"func main() {var fs = [4]func(){} //定義一個變數fs,類型為一個數組,數組元素的類型是 funcfor i := 0; i < 4; i++ {    defer fmt.Println("defer i=", i)    defer func() { fmt.Println("defer closure i=", i) }()    fs[i] = func() { fmt.Println("closure i=", i) }}for _, f := range fs {    f()}}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.