日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
【Go必知必會】錯誤和異常、CGO、fallthrough

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

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、成都微信小程序、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了仙游免費建站歡迎大家使用!

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

錯誤&異常

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

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

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

處理錯誤: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掛上去的任務,執(zhí)行完畢后再退出整個程序。

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

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

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

defer執(zhí)行順序

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

總結(jié)

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

對比Java、C++

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

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

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

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

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

CGO

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

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

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

fallthrough

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

如果我們想強制執(zhí)行滿足條件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")
}
}

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

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

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

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

總結(jié)

我們來總結(jié)一下:

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

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

轉(zhuǎn)載本文請聯(lián)系「 程序員升級打怪之旅」公眾號。


網(wǎng)站欄目:【Go必知必會】錯誤和異常、CGO、fallthrough
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/dpghies.html