網(wǎng)站首頁 編程語言 正文
fallthrough
在一個 switch 塊內(nèi),每個 case 無需聲明 break 來終止,如果想順序執(zhí)行使用fallthrough;
如果我們想強制執(zhí)行滿足條件case的后一個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é)果
注意:在一個switch塊內(nèi),都建議包含一個 default 語句并且放在最后,即使它什么代碼也沒有。
延伸知識點:在select塊中,default能避免死鎖問題。
CGO
CGO是調(diào)用C代碼模塊,靜態(tài)庫和動態(tài)庫。
CGO是C語言和Go語言之間的橋梁,原則上無法直接支持C++的類。CGO不支持C++語法的根本原因是C++至今為止還沒有一個二進制接口規(guī)范(ABI)。CGO只支持C語言中值類型的數(shù)據(jù)類型,所以我們是無法直接使用C++的引用參數(shù)等特性的。
錯誤&異常
錯誤指的是可能出現(xiàn)問題的地方出現(xiàn)了問題,比如打開一個文件時失敗,這種情況在人們的意料之中
異常指的是不應(yīng)該出現(xiàn)問題的地方出現(xiàn)了問題,比如引用了空指針,這種情況在人們的意料之外。
可見,錯誤是業(yè)務(wù)過程的一部分,而異常不是?。
處理錯誤:error
Golang中引入error接口類型作為錯誤處理的標準模式,如果函數(shù)要返回錯誤,則返回值類型列表中肯定包含error。error處理過程類似于C語言中的錯誤碼,可逐層返回,直到被處理。
處理異常:panic&recover
Golang中引入兩個內(nèi)置函數(shù)panic和recover來觸發(fā)和終止異常處理流程,同時引入關(guān)鍵字defer來延遲執(zhí)行defer后面的函數(shù)。
panic&defer
當數(shù)組越界、訪問非法空間或者我們直接調(diào)用panic時,panic會停掉當前正在執(zhí)行的程序,包括所有協(xié)程,比起exit直接退出,panic的退出更有秩序,他會他會先處理完當前goroutine已經(jīng)defer掛上去的任務(wù),執(zhí)行完畢后再退出整個程序。
而defer的存在,讓我們有更多的選擇,比如在defer中通過recover截取panic,從而達到try…catch的效果
panic還可以接收一個參數(shù),通常是字符串類型錯誤信息,執(zhí)行到panic時,他會打印這個字符串和觸發(fā)他的調(diào)用戰(zhàn)。
當然,我們在寫代碼時要注意,不是所有的異常都能被捕獲到的,向fatal error 和runtime.throw 都是不能被recover的
defer執(zhí)行順序
你可以在一個函數(shù)中執(zhí)行多條defer語句,它們的執(zhí)行順序與聲明順序相反。
總結(jié)
當程序運行時,如果遇到引用空指針、下標越界或顯式調(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)用,則會到達該攜程的起點,該攜程結(jié)束,然后終止其他所有攜程,包括主攜程(類似于C語言中的主線程,該攜程ID為1)。
對比Java、C++
錯誤和異常從Golang機制上講,就是error和panic的區(qū)別。很多其他語言也一樣,比如C++/Java,沒有error但有errno,沒有panic但有throw。
錯誤異常互相轉(zhuǎn)換
Golang錯誤和異常是可以互相轉(zhuǎn)換的:
- 錯誤轉(zhuǎn)異常,比如程序邏輯上嘗試請求某個URL,最多嘗試三次,嘗試三次的過程中請求失敗是錯誤,嘗試完第三次還不成功的話,失敗就被提升為異常了。
- 異常轉(zhuǎn)錯誤,比如panic觸發(fā)的異常被recover恢復(fù)后,將返回值中error類型的變量進行賦值,以便上層函數(shù)繼續(xù)走錯誤處理流程
原文鏈接:https://juejin.cn/post/7135581854073094157
相關(guān)推薦
- 2023-01-01 Android?webView加載數(shù)據(jù)時內(nèi)存溢出問題及解決_Android
- 2022-08-30 DOM節(jié)點對象 、獲取節(jié)點、節(jié)點屬性、動態(tài)操作DOM節(jié)點、toList1.0/toList2.0、
- 2022-12-05 GPU狀態(tài)監(jiān)測?nvidia-smi?命令的用法詳解_python
- 2023-12-26 layui彈窗傳值
- 2022-04-27 C語言陷阱與缺陷之數(shù)組越界訪問詳解_C 語言
- 2022-02-19 數(shù)據(jù)結(jié)構(gòu)C語言鏈表的實現(xiàn)介紹_C 語言
- 2022-06-22 Git的基礎(chǔ)文件操作初始化查看添加提交示例教程_其它綜合
- 2022-03-25 在NET?Core?中獲取?CPU?使用率_ASP.NET
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支