首頁 > 軟體

Go錯誤和異常CGO fallthrough處理教學詳解

2022-08-25 10:02:11

fallthrough

在一個 switch 塊內,每個 case 無需宣告 break 來終止,如果想順序執行使用fallthrough

如果我們想強制執行滿足條件case的後一個case,也可以通過設定fallthrough的方式:

程式碼範例

package main
import "fmt"
func main() {
    switch {
    case false:
            fmt.Println("false1")
            fallthrough
    case true:
            fmt.Println("true1")
            fallthrough
    case false:
            fmt.Println("false2")
            fallthrough
    case true:
            fmt.Println("true2")
    case false:
            fmt.Println("false3")
            fallthrough
    default:
            fmt.Println("default case")
    }
}

思考一下上面程式碼的執行結果是什麼?

執行結果

注意:在一個switch塊內,都建議包含一個 default 語句並且放在最後,即使它什麼程式碼也沒有。

延伸知識點:在select塊中,default能避免死鎖問題。

CGO

CGO是呼叫C程式碼模組,靜態庫和動態庫。

CGO是C語言和Go語言之間的橋樑,原則上無法直接支援C++的類別。CGO不支援C++語法的根本原因是C++至今為止還沒有一個二進位制介面規範(ABI)。CGO只支援C語言中值型別的資料型別,所以我們是無法直接使用C++的參照引數等特性的。

錯誤&異常

錯誤指的是可能出現問題的地方出現了問題,比如開啟一個檔案時失敗,這種情況在人們的意料之中

異常指的是不應該出現問題的地方出現了問題,比如參照了空指標,這種情況在人們的意料之外。

可見,錯誤是業務過程的一部分,而異常不是 。

處理錯誤:error

Golang中引入error介面型別作為錯誤處理的標準模式,如果函數要返回錯誤,則返回值型別列表中肯定包含error。error處理過程類似於C語言中的錯誤碼,可逐層返回,直到被處理。

處理異常:panic&recover

Golang中引入兩個內建函數panic和recover來觸發和終止例外處理流程,同時引入關鍵字defer來延遲執行defer後面的函數。

panic&defer

當陣列越界、存取非法空間或者我們直接呼叫panic時,panic會停掉當前正在執行的程式,包括所有協程,比起exit直接退出,panic的退出更有秩序,他會他會先處理完當前goroutine已經defer掛上去的任務,執行完畢後再退出整個程式。

而defer的存在,讓我們有更多的選擇,比如在defer中通過recover擷取panic,從而達到try…catch的效果

panic還可以接收一個引數,通常是字串型別錯誤資訊,執行到panic時,他會列印這個字串和觸發他的呼叫戰。

當然,我們在寫程式碼時要注意,不是所有的異常都能被捕獲到的,向fatal error 和runtime.throw 都是不能被recover的

defer執行順序

你可以在一個函數中執行多條defer語句,它們的執行順序與宣告順序相反。

總結

當程式執行時,如果遇到參照空指標、下標越界或顯式呼叫panic函數等情況,則先觸發panic函數的執行,然後呼叫延遲函數。呼叫者繼續傳遞panic,因此該過程一直在呼叫棧中重複發生:函數停止執行,呼叫延遲執行函數等。如果一路在延遲函數中沒有recover函數的呼叫,則會到達該攜程的起點,該攜程結束,然後終止其他所有攜程,包括主攜程(類似於C語言中的主執行緒,該攜程ID為1)。

對比Java、C++

錯誤和異常從Golang機制上講,就是error和panic的區別。很多其他語言也一樣,比如C++/Java,沒有error但有errno,沒有panic但有throw。

錯誤異常互相轉換

Golang錯誤和異常是可以互相轉換的:

  • 錯誤轉異常,比如程式邏輯上嘗試請求某個URL,最多嘗試三次,嘗試三次的過程中請求失敗是錯誤,嘗試完第三次還不成功的話,失敗就被提升為異常了。
  • 異常轉錯誤,比如panic觸發的異常被recover恢復後,將返回值中error型別的變數進行賦值,以便上層函數繼續走錯誤處理流程

以上就是Go錯誤和異常CGO fallthrough使用教學詳解的詳細內容,更多關於Go錯誤異常CGO fallthrough的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com