成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【Go必知必會】錯誤和異常、CGO、fallthrough

開發 后端
在一個 switch 塊內,每個 case 無需聲明 break 來終止,如果想順序執行使用fallthrough;如果我們想強制執行滿足條件case的后一個case,也可以通過設置fallthrough的方式。

?這篇文章將詳解「Go必知必會」的知識點:

  • 錯誤和異常的對比、發生panic后如何執行代碼?會執行到defer代碼段嗎?
  • CGO是什么?CGO的作用是什么?
  • switch中的fallthrough

錯誤&異常

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

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

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

處理錯誤: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語句,它們的執行順序與聲明順序相反:最早聲明的defer最后執行。

總結

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

對比Java、C++

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

錯誤異常互相轉換

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

錯誤轉異常,比如程序邏輯上嘗試請求某個URL,最多嘗試三次,嘗試三次的過程中請求失敗是錯誤,嘗試完第三次還不成功的話,失敗就被提升為異常了。

異常轉錯誤,比如panic觸發的異常被recover恢復后,將返回值中error類型的變量進行賦值,以便上層函數繼續走錯誤處理流程

CGO

CGO是調用C代碼模塊,靜態庫和動態庫。

CGO是C語言和Go語言之間的橋梁,原則上無法直接支持C++的類。CGO不支持C++語法的根本原因是C++至今為止還沒有一個二進制接口規范(ABI)。

CGO只支持C語言中值類型的數據類型,所以我們是無法直接使用C++的引用參數等特性的。

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能避免死鎖問題。

總結

我們來總結一下:

  • 在一個 switch 塊內,每個 case 無需聲明 break 來終止,如果想順序執行使用fallthrough;如果我們想強制執行滿足條件case的后一個case,也可以通過設置fallthrough的方式。
  • CGO是調用C代碼模塊,靜態庫和動態庫。CGO只支持C語言中值類型的數據類型,所以我們是無法直接使用C++的引用參數等特性的。
  • 當程序運行時,如果遇到引用空指針、下標越界或顯式調用panic函數等情況,則先觸發panic函數的執行,然后調用延遲函數。調用者繼續傳遞panic,因此該過程一直在調用棧中重復發生:函數停止執行,調用延遲執行函數等。如果一路在延遲函數中沒有recover函數的調用,則會到達該協程的起點,該協程結束,然后終止其他所有協程,包括主協程(類似于C語言中的主線程,該協程ID為1)。

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「王中陽Go」,可以通過以下二維碼關注。

轉載本文請聯系「 程序員升級打怪之旅」公眾號。

責任編輯:武曉燕 來源: 程序員升級打怪之旅
相關推薦

2022-12-07 09:00:18

錯誤異常CGO

2024-07-26 08:32:44

panic?Go語言

2024-06-13 09:10:22

2020-07-10 07:58:14

Linux

2024-06-19 10:08:34

GoChannel工具

2024-11-15 11:11:48

2023-10-13 00:00:00

設計模式GO語言

2024-01-03 07:56:50

2024-08-29 10:12:35

RPC通信機制遠程過程

2022-05-18 09:01:19

JSONJavaScript

2024-09-27 12:13:26

GoGTokenSSO

2024-09-02 09:00:59

2022-08-19 10:31:32

Kafka大數據

2023-05-10 07:15:22

Nacos管理工具配置

2015-10-20 09:46:33

HTTP網絡協議

2019-01-30 14:14:16

LinuxUNIX操作系統

2018-10-26 14:10:21

2023-04-20 14:31:20

Python開發教程

2015-08-17 16:05:35

javascript對象編程

2024-01-09 13:58:22

PandasPython數據分析
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区国产精品 | 亚洲精品日日夜夜 | 亚洲有码转帖 | 国产精品久久国产精品 | 久久精品 | 欧美激情精品久久久久久变态 | 欧美激情第一区 | 精品毛片 | 欧美人妇做爰xxxⅹ性高电影 | 91在线一区二区三区 | 免费日韩av | 精品一区二区三区免费视频 | 岛国av免费在线观看 | 久久天天躁狠狠躁夜夜躁2014 | 在线中文视频 | 日韩无| 欧美精品一区二区三区在线 | av中文字幕在线 | 国产在线播放av | 毛片大全| 日韩中文字幕在线观看 | 91久久伊人 | 久草综合在线视频 | 久久r免费视频 | 欧美精品一区久久 | 欧美日韩一区二区三区在线观看 | 久久精品国产一区二区三区不卡 | 国产精品综合色区在线观看 | 国产成人精品一区二区三区在线 | 久久久久资源 | 国产精品久久久久久一区二区三区 | 日韩在线免费播放 | 久久综合久久综合久久 | 日韩av成人在线观看 | 国产日本精品视频 | 九九免费视频 | 精品视频在线观看 | 日韩成人免费视频 | 国内精品视频在线 | 奇米视频777| 中文字幕日韩欧美一区二区三区 |