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

Go語(yǔ)言error的設(shè)計(jì)理念及背景演化詳解

 更新時(shí)間:2022年12月07日 09:33:35   作者:bluesGavin  
這篇文章主要為大家介紹了Go語(yǔ)言error的設(shè)計(jì)理念及背景演化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

作為一門(mén)相對(duì)新興的語(yǔ)言,Go 可以說(shuō)是站在巨人的肩膀上。從 Go 語(yǔ)法上,我們可以看出設(shè)計(jì)者對(duì)其有許多嚴(yán)肅的思考。其中 Error 的處理就是極具標(biāo)志性的一項(xiàng)。

值得注意的是,Go 中的 Error 一直是一個(gè)有爭(zhēng)議的內(nèi)容。很多議案不斷的提出又推翻,即便是官方的 error 庫(kù)也在多個(gè)版本中不斷迭代。本文內(nèi)容基于 1.19.3 版本的 Go 編寫(xiě)。

各語(yǔ)言中 Error 的演化

想要了解 Error 在 Go 中占據(jù)話(huà)題的原因,我們需要先了解 Error 在編程語(yǔ)言中的演化。

C語(yǔ)言

C語(yǔ)言中開(kāi)發(fā)者需要根據(jù)函數(shù)的返回值作錯(cuò)誤判斷。每個(gè)函數(shù)是單返回值,一般通過(guò)傳遞指針作為入?yún)?。返回值?int 類(lèi)型,表示成功或失敗。

顯然在這個(gè)階段,語(yǔ)言設(shè)計(jì)者只單純地把錯(cuò)誤考慮為“異常”情況,由開(kāi)發(fā)者判斷函數(shù)的執(zhí)行結(jié)果。這種情況下,錯(cuò)誤中并沒(méi)有太多信息。這會(huì)加重開(kāi)發(fā)者對(duì)錯(cuò)誤的處理工作。

C++

進(jìn)入C++時(shí)代以后,語(yǔ)言帶來(lái)了 exception 。錯(cuò)誤會(huì)作為一個(gè)程序正常執(zhí)行以外的一個(gè)特殊情況被拋出。而開(kāi)發(fā)者可以通過(guò) try....catch.... 對(duì)異常作特殊處理。

這種設(shè)計(jì)模式的影響很廣,包括 Javascript 在內(nèi)很多語(yǔ)言都延續(xù)了這種設(shè)計(jì)。其特點(diǎn)為,開(kāi)發(fā)者可以知道錯(cuò)誤在哪里拋出,但不能具體知道調(diào)用方會(huì)拋出什么異常。

Go 中 Error 的理念

在 Go 的 Error 中,我們可以看到兩個(gè) ERROR 的特點(diǎn)。

1. 區(qū)分 Error 和 Exception

第一點(diǎn)是,Go 中真正從語(yǔ)言設(shè)計(jì)上區(qū)分開(kāi)了 Error 和 Exception。Go 的處理異常邏輯不引入 exception ,支持多參數(shù)返回,所以開(kāi)發(fā)者可以很容易在函數(shù)簽名中帶上實(shí)現(xiàn)了 error interface 的對(duì)象,交由調(diào)用者處理。

通常如果一個(gè)函數(shù)返回了 value 和 error , 開(kāi)發(fā)者需要先判定 error,再利用處理 value 處理下一步邏輯。常見(jiàn)代碼如下:

value, err := getSomething()
if err != nil{
    // 處理錯(cuò)誤
    return
}
// 邏輯處理

另外,Go 中引入了 panic 機(jī)制,它與其他語(yǔ)言的 exception 不完全一樣。在其他語(yǔ)言中,當(dāng)程序拋出異常時(shí),相當(dāng)于把 exception 拋給開(kāi)發(fā)者處理。而 Go 中的 panic 是專(zhuān)門(mén),針對(duì)真正意外,不可恢復(fù)的情況,如索引越界、不可恢復(fù)的環(huán)境問(wèn)題、棧溢出。

同時(shí),GO 也提供了從 panic 中恢復(fù)的接口—— recover 。但這不意味著開(kāi)發(fā)者應(yīng)該把其當(dāng)作 try... catch... 使用。而是應(yīng)該當(dāng)作是程序崩潰后的特殊處理的最后機(jī)會(huì)。在 Go 的設(shè)計(jì)中,panic 一旦觸發(fā),說(shuō)明程序應(yīng)該要退出了。但在某些業(yè)務(wù)場(chǎng)景下,我們可能還會(huì)有日志上報(bào),日志打印,信息通知等操作。此時(shí),就應(yīng)該考慮使用 recover。

2.Error是一個(gè)接口

第二點(diǎn)是,Error 在 Go 中其實(shí)是一個(gè)普通的接口。它不僅保存著錯(cuò)誤的信息,還提供了一系列的方式供開(kāi)發(fā)者使用。因此開(kāi)發(fā)者可以自行拓展,嵌套,封裝新的 error ,為項(xiàng)目提供自定義錯(cuò)誤模塊。

由此看來(lái),Error 在 Go 中并不像其他語(yǔ)言一樣,是一個(gè)特殊的類(lèi)型。它只是一個(gè)普通的值,開(kāi)發(fā)者完全可以自己實(shí)現(xiàn)一套新的 Error 接口。但更多時(shí)候,官方的 errors 庫(kù)已經(jīng)可以覆蓋絕大多數(shù)場(chǎng)景了。

因此, Go 的設(shè)計(jì)并不是在定義一套新的 Error 機(jī)制。而是在制定一套 Error 在代碼邏輯中處理的規(guī)范。你不必完全遵守這套規(guī)范,但在各種實(shí)際開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)來(lái)看,Go 的這種設(shè)計(jì)模式確實(shí)贏(yíng)得了很多開(kāi)發(fā)者的青睞。

示例代碼:

// 創(chuàng)建一個(gè)error
newErr := errors.New("一個(gè)錯(cuò)誤")
// 判斷error類(lèi)型
if errors.Is(newErr, fs.ErrNotExist) {
	fmt.Println("file does not exist")
} else {
	fmt.Println(err)
}

總結(jié)

Go 之所以從誕生至今,吸引了這么多的粉絲。處理語(yǔ)言的機(jī)制以外,更多的就是它的設(shè)計(jì)理念。而本文講述的 error 就是其中一部分。我們?cè)谑褂?Go 開(kāi)發(fā)時(shí),除了按照它推薦的規(guī)范編碼至于,還應(yīng)該關(guān)心、理解它的設(shè)計(jì)。只有這樣,才能寫(xiě)出更優(yōu)秀的作品。

進(jìn)一步閱讀 官方 errors 庫(kù)文檔地址:pkg.go.dev/errors

以上就是Go語(yǔ)言error的設(shè)計(jì)理念及背景演化詳解的詳細(xì)內(nèi)容,更多關(guān)于Go error設(shè)計(jì)理念的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang語(yǔ)言中for循環(huán)語(yǔ)句用法實(shí)例

    golang語(yǔ)言中for循環(huán)語(yǔ)句用法實(shí)例

    這篇文章主要介紹了golang語(yǔ)言中for循環(huán)語(yǔ)句用法,實(shí)例分析了for循環(huán)遍歷的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • Go編程中常見(jiàn)錯(cuò)誤和不良實(shí)踐解析

    Go編程中常見(jiàn)錯(cuò)誤和不良實(shí)踐解析

    這篇文章主要為大家介紹了Go編程中常見(jiàn)錯(cuò)誤和不良實(shí)踐解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語(yǔ)言題解LeetCode463島嶼的周長(zhǎng)示例詳解

    Go語(yǔ)言題解LeetCode463島嶼的周長(zhǎng)示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode463島嶼的周長(zhǎng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Golang中定時(shí)器的陷阱詳解

    Golang中定時(shí)器的陷阱詳解

    這篇文章主要給大家介紹了關(guān)于Golang中定時(shí)器陷阱的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 一文帶你熟悉Go語(yǔ)言中的分支結(jié)構(gòu)

    一文帶你熟悉Go語(yǔ)言中的分支結(jié)構(gòu)

    這篇文章主要和大家分享一下Go語(yǔ)言中的分支結(jié)構(gòu)(if?-?else-if?-?else、switch),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2022-11-11
  • go mod 使用舊版本 版本號(hào)指定方式

    go mod 使用舊版本 版本號(hào)指定方式

    這篇文章主要介紹了go mod 使用舊版本 版本號(hào)指定方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 基于Go?goroutine實(shí)現(xiàn)一個(gè)簡(jiǎn)單的聊天服務(wù)

    基于Go?goroutine實(shí)現(xiàn)一個(gè)簡(jiǎn)單的聊天服務(wù)

    對(duì)于聊天服務(wù),想必大家都不會(huì)陌生,因?yàn)樵谖覀兊纳钪薪?jīng)常會(huì)用到,本文我們用?Go?并發(fā)來(lái)實(shí)現(xiàn)一個(gè)聊天服務(wù)器,這個(gè)程序可以讓一些用戶(hù)通過(guò)服務(wù)器向其它所有用戶(hù)廣播文本消息,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Golang簡(jiǎn)介與基本語(yǔ)法的學(xué)習(xí)

    Golang簡(jiǎn)介與基本語(yǔ)法的學(xué)習(xí)

    這篇文章主要介紹了Golang簡(jiǎn)介與基本語(yǔ)法的學(xué)習(xí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • golang 實(shí)現(xiàn)interface{}轉(zhuǎn)其他類(lèi)型操作

    golang 實(shí)現(xiàn)interface{}轉(zhuǎn)其他類(lèi)型操作

    這篇文章主要介紹了golang 實(shí)現(xiàn)interface{}轉(zhuǎn)其他類(lèi)型操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析

    go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析

    這篇文章主要為大家介紹了go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論