亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go錯(cuò)誤和異常CGO?fallthrough處理教程詳解

 更新時(shí)間:2022年08月25日 08:35:33   作者:王中陽Go  
這篇文章主要為大家介紹了Go錯(cuò)誤和異常CGO?fallthrough使用教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

fallthrough

在一個(gè) switch 塊內(nèi),每個(gè) case 無需聲明 break 來終止,如果想順序執(zhí)行使用fallthrough

如果我們想強(qiáng)制執(zhí)行滿足條件case的后一個(gè)case,也可以通過設(shè)置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")
    }
}

思考一下上面代碼的執(zhí)行結(jié)果是什么?

執(zhí)行結(jié)果

注意:在一個(gè)switch塊內(nèi),都建議包含一個(gè) default 語句并且放在最后,即使它什么代碼也沒有。

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

CGO

CGO是調(diào)用C代碼模塊,靜態(tài)庫和動態(tài)庫。

CGO是C語言和Go語言之間的橋梁,原則上無法直接支持C++的類。CGO不支持C++語法的根本原因是C++至今為止還沒有一個(gè)二進(jìn)制接口規(guī)范(ABI)。CGO只支持C語言中值類型的數(shù)據(jù)類型,所以我們是無法直接使用C++的引用參數(shù)等特性的。

錯(cuò)誤&異常

錯(cuò)誤指的是可能出現(xiàn)問題的地方出現(xiàn)了問題,比如打開一個(gè)文件時(shí)失敗,這種情況在人們的意料之中

異常指的是不應(yīng)該出現(xiàn)問題的地方出現(xiàn)了問題,比如引用了空指針,這種情況在人們的意料之外。

可見,錯(cuò)誤是業(yè)務(wù)過程的一部分,而異常不是 。

處理錯(cuò)誤:error

Golang中引入error接口類型作為錯(cuò)誤處理的標(biāo)準(zhǔn)模式,如果函數(shù)要返回錯(cuò)誤,則返回值類型列表中肯定包含error。error處理過程類似于C語言中的錯(cuò)誤碼,可逐層返回,直到被處理。

處理異常:panic&recover

Golang中引入兩個(gè)內(nèi)置函數(shù)panic和recover來觸發(fā)和終止異常處理流程,同時(shí)引入關(guān)鍵字defer來延遲執(zhí)行defer后面的函數(shù)。

panic&defer

當(dāng)數(shù)組越界、訪問非法空間或者我們直接調(diào)用panic時(shí),panic會停掉當(dāng)前正在執(zhí)行的程序,包括所有協(xié)程,比起exit直接退出,panic的退出更有秩序,他會他會先處理完當(dāng)前goroutine已經(jīng)defer掛上去的任務(wù),執(zhí)行完畢后再退出整個(gè)程序。

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

panic還可以接收一個(gè)參數(shù),通常是字符串類型錯(cuò)誤信息,執(zhí)行到panic時(shí),他會打印這個(gè)字符串和觸發(fā)他的調(diào)用戰(zhàn)。

當(dāng)然,我們在寫代碼時(shí)要注意,不是所有的異常都能被捕獲到的,向fatal error 和runtime.throw 都是不能被recover的

defer執(zhí)行順序

你可以在一個(gè)函數(shù)中執(zhí)行多條defer語句,它們的執(zhí)行順序與聲明順序相反。

總結(jié)

當(dāng)程序運(yùn)行時(shí),如果遇到引用空指針、下標(biāo)越界或顯式調(diào)用panic函數(shù)等情況,則先觸發(fā)panic函數(shù)的執(zhí)行,然后調(diào)用延遲函數(shù)。調(diào)用者繼續(xù)傳遞panic,因此該過程一直在調(diào)用棧中重復(fù)發(fā)生:函數(shù)停止執(zhí)行,調(diào)用延遲執(zhí)行函數(shù)等。如果一路在延遲函數(shù)中沒有recover函數(shù)的調(diào)用,則會到達(dá)該攜程的起點(diǎn),該攜程結(jié)束,然后終止其他所有攜程,包括主攜程(類似于C語言中的主線程,該攜程ID為1)。

對比Java、C++

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

錯(cuò)誤異?;ハ噢D(zhuǎn)換

Golang錯(cuò)誤和異常是可以互相轉(zhuǎn)換的:

  • 錯(cuò)誤轉(zhuǎn)異常,比如程序邏輯上嘗試請求某個(gè)URL,最多嘗試三次,嘗試三次的過程中請求失敗是錯(cuò)誤,嘗試完第三次還不成功的話,失敗就被提升為異常了。
  • 異常轉(zhuǎn)錯(cuò)誤,比如panic觸發(fā)的異常被recover恢復(fù)后,將返回值中error類型的變量進(jìn)行賦值,以便上層函數(shù)繼續(xù)走錯(cuò)誤處理流程

以上就是Go錯(cuò)誤和異常CGO fallthrough使用教程詳解的詳細(xì)內(nèi)容,更多關(guān)于Go錯(cuò)誤異常CGO fallthrough的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言使用swagger生成接口文檔的方法

    Go語言使用swagger生成接口文檔的方法

    這篇文章主要介紹了Go語言使用swagger生成接口文檔的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Go語言實(shí)現(xiàn)請求超時(shí)處理的方法總結(jié)

    Go語言實(shí)現(xiàn)請求超時(shí)處理的方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語言中實(shí)現(xiàn)請求的超時(shí)控制的方法,主要是通過timer和timerCtx來實(shí)現(xiàn)請求的超時(shí)控制,希望對大家有所幫助
    2023-05-05
  • 淺析Golang中變量與常量的聲明與使用

    淺析Golang中變量與常量的聲明與使用

    變量、常量的聲明與使用是掌握一門編程語言的基礎(chǔ),這篇文章主要為大家詳細(xì)介紹了Golang中變量與常量的聲明與使用,需要的可以參考一下
    2023-04-04
  • Go?gRPC進(jìn)階教程服務(wù)超時(shí)設(shè)置

    Go?gRPC進(jìn)階教程服務(wù)超時(shí)設(shè)置

    這篇文章主要為大家介紹了Go?gRPC進(jìn)階,gRPC請求的超時(shí)時(shí)間設(shè)置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 基于Go語言實(shí)現(xiàn)猜謎游戲

    基于Go語言實(shí)現(xiàn)猜謎游戲

    這篇文章主要為大家詳細(xì)介紹了如何基于Go語言實(shí)現(xiàn)猜謎游戲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)
    2023-09-09
  • golang使用viper加載配置文件實(shí)現(xiàn)自動反序列化到結(jié)構(gòu)

    golang使用viper加載配置文件實(shí)現(xiàn)自動反序列化到結(jié)構(gòu)

    這篇文章主要為大家介紹了golang使用viper加載配置文件實(shí)現(xiàn)自動反序列化到結(jié)構(gòu)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • GO語言判斷一個(gè)網(wǎng)段是否屬于另一個(gè)網(wǎng)段的子網(wǎng)

    GO語言判斷一個(gè)網(wǎng)段是否屬于另一個(gè)網(wǎng)段的子網(wǎng)

    這篇文章主要介紹了GO語言判斷一個(gè)網(wǎng)段是否屬于另一個(gè)網(wǎng)段的子網(wǎng)的相關(guān)資料,內(nèi)容介紹詳細(xì),具有一定的參考價(jià)值,需要的朋友可任意參考一下
    2022-03-03
  • Go中Context使用源碼解析

    Go中Context使用源碼解析

    這篇文章主要為大家介紹了Go中Context使用源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go語言結(jié)構(gòu)體定義和使用方法

    Go語言結(jié)構(gòu)體定義和使用方法

    這篇文章主要介紹了Go語言結(jié)構(gòu)體定義和使用方法,以實(shí)例形式分析了Go語言中結(jié)構(gòu)體的定義和使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • GoLang context包的使用方法介紹

    GoLang context包的使用方法介紹

    日常Go開發(fā)中,Context包是用的最多的一個(gè)了,幾乎所有函數(shù)的第一個(gè)參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實(shí)現(xiàn)是如何呢?相信你也一定會有探索的欲望,那么就跟著本篇文章,一起來學(xué)習(xí)吧
    2023-03-03

最新評論