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

這個新 Go 錯誤處理提案,能解決問題不?

開發(fā) 前端
在這一個新提案中,作者正在做意見征集的階段。其主要是推行了 or 關(guān)鍵字和變量可傳遞至右側(cè)函數(shù)等多種思路(前段時間我還分享了個左側(cè)函數(shù)和表達式的提案)。

大家好,我是煎魚。

Go 語言的一大特色就是它的錯誤機制,因此基本上所有的錯誤處理提案或討論我都會有所查看和學習,開拓不同的思考視野和解決方法。

今天分享的是 @Cristo García[1] 所提出的提案《Simple Error Handling for Go 2[2]》,略有修改,和煎魚一起學習和討論吧!

Go 必須仍然是 Go

這一個提案的核心觀點是 Go 必須仍然是 Go,這意味著對于錯誤處理的改造需要滿足如下原則:

增加盡可能少的語法。

  • 盡可能明確方便。
  • 本文中的 “我“ 均指代提案作者 @Cristo García,并非正在學習的煎魚。

原想法

原提案作者 @PeterRk 提出了以下思想:

func getDivisorFromDB(key string) (uint, error) {
//...
}

func GetDivisor(key string) (uint, error) {
exit := func(err error) (uint, error) {
return 1, fmt.Errorf("fail to get divisor with key \"%s\": %v", key, err)
}

divisor := check(getDivisorFromDB(key), exit)

//...
return divisor, nil
}

使用示例:

divisor := check(getDivisorFromDB(key), exit)

等同于現(xiàn)有的:

divisor, err := getDivisorFromDB(key)
if err != nil {
return exit(err) //return err
}

注意看 check 函數(shù),第二個參數(shù)的 exit 函數(shù)是它 if err != nil 后的回調(diào)方法,用于出現(xiàn) err 時的錯誤處理。

提案作者認為這是一個正確的方向,我們可以改進它(言外之意:現(xiàn)在的還不夠好)。

問題是什么

原有的這個想法,有如下兩個問題:

  • 包含不明確的返回語句。
  • 有時抽象是不必要的,并且使代碼更難閱讀。

新想法

為此新的想法需要解決以上兩個問題,@Cristo García 期望達到更好的效果。通過對語法的簡單修改,我們新增 or 關(guān)鍵字。

可以得到以下示例:

divisor, err := getDivisorFromDB(key) or return exit(err)

新增加的 or 關(guān)鍵字將會檢測最后返回的值(必須是錯誤類型)是否與 nil 不同。若不同,將執(zhí)行右邊的函數(shù)。

我們也可以省略 return,代碼將繼續(xù)執(zhí)行。它將像在常規(guī) Go 代碼中一樣被丟棄,這樣該函數(shù)就更可重用。

如下示例:

func GetDivisor(key string) (divisor uint, err error) {
divisor, err = getDivisorFromDB(key) or return
return
}

也就是 or return 語句后不跟任何東西,是可以的,會默認拋棄掉。

特殊場景:defer

本節(jié)只是為了辯論,但我們可以借此機會為 defer 添加錯誤檢查,看看能不能做一些什么,得到新的處理方式。

核心思路:如果我們能不把返回的錯誤保存在一個變量中,并在 defer 中使之或得到觸發(fā),那么會非常的有意思。

如下示例 1:

defer f.Close() or return errHdl("", fmt.Errorf("couldn't close file"))

不主動顯式聲明變量,若返回值是錯誤類型且不等于 nil,則自動調(diào)用 or return 右側(cè)的函數(shù)并進行處理。

如下示例 2:

defer err := f.Close() or return errHdl("couldn't close file", err)

定義接受錯誤的變量 err 變量,能通過 or return 的語法直接傳參進入函數(shù) errHdl 的入?yún)⒅斜皇褂谩?/p>

結(jié)果

新增了新的 or return 語法后再與原有的錯誤處理機制進行對比,看看如何。

新的:

func Foo(path string) ([]byte, error) {
errHdlr := func(reason string, err error) ([]byte, error) {
return nil, fmt.Errorf("foo %s %w", reason, err)
}

f, err := os.Open(path) or return errHdlr("couldn't open file", err)
defer f.Close() or return errHdl("", fmt.Errorf("couldn't close file"))
result, err := io.ReadAll(f) or return errHdlr("couldn't read from file " + path, err)
return result, nil
}

舊的:

func Foo(path string) ([]byte, error) {
f, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("foo %s %w", "couldn't open file", err)
}
result, err := io.ReadAll(f)
if err != nil {
return nil, fmt.Errorf("foo %s %w", "couldn't read from file " + path, err)
}
err = f.Close()
if err != nil {
return nil, fmt.Errorf("foo %s %w", "couldn't close the file " + path, err)
}
return result, nil
}

這是一個非常簡單的例子,但我們已經(jīng)可以看到其好處。正在閱讀代碼的程序員甚至可以把注意力放在左邊而忽略錯誤處理。

在使用 gofmt 格式化代碼后,也比較美觀。

如下示例:

f, err := os.Open(path)      or return errHdlr("couldn't open file", err)
defer f.Close() or return errHdl("", fmt.Errorf("couldn't close file"))
result, err := io.ReadAll(f) or return errHdlr("couldn't read from file " + path, err)

對的很齊。

總結(jié)

在這一個新提案中,作者正在做意見征集的階段。其主要是推行了 or 關(guān)鍵字和變量可傳遞至右側(cè)函數(shù)等多種思路(前段時間我還分享了個左側(cè)函數(shù)和表達式的提案)。

該作者的目的是想盡可能的方便,并且不寫以往被大家吐槽的 if err != nil,實現(xiàn)更加的簡潔。

你覺得這個提案怎么樣呢?歡迎在評論區(qū)交流和討論。

參考資料

[1]Cristo García: https://gist.github.com/GGCristo

[2]Simple Error Handling for Go 2: https://gist.github.com/GGCristo/27c33308a07c1be216542f1005792c2b

責任編輯:武曉燕 來源: 腦子進煎魚了
相關(guān)推薦

2022-10-24 08:55:13

Go工具鏈開發(fā)者

2024-06-05 08:47:20

Go語言方式

2022-09-05 08:55:15

Go2提案語法

2024-03-14 09:35:54

Go 錯誤select代碼

2024-11-19 09:10:19

迭代器Go語言

2025-02-08 09:57:20

2022-08-01 08:48:39

Go代碼接口

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2025-02-24 09:30:15

2024-02-28 08:54:57

switchGo錯誤

2009-11-05 18:59:22

Windows 7屏幕錄像

2025-06-06 06:45:54

2021-09-13 07:53:31

Go錯誤處理

2025-03-31 00:29:44

2023-03-10 08:48:29

2025-06-30 09:49:11

2021-02-25 15:51:41

Go語言模糊測試功能

2024-03-27 08:18:02

Spring映射HTML

2021-09-27 15:33:48

Go 開發(fā)技術(shù)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99热精品久久 | 日韩精品免费一区二区在线观看 | 最新黄色毛片 | 红色av社区| 91精品久久久久久久 | 国产成人精品网站 | 在线资源视频 | 国产成人精品一区二 | 亚洲精品一区二区三区在线 | 国产精品96久久久久久 | 久久免费精品视频 | 日日躁狠狠躁aaaaxxxx | 毛片网站在线观看 | 日韩1区2区 | 国产精品揄拍一区二区久久国内亚洲精 | 黑人巨大精品 | 久久久久久国产精品久久 | 亚洲精品一区二区三区在线 | 久久久久久九九九九 | 一级视频在线免费观看 | 欧美国产日韩在线观看 | 一区在线观看 | 看av电影| 99re热精品视频 | 欧美另类视频 | 中文字幕欧美日韩 | 91文字幕巨乱亚洲香蕉 | 久久亚洲一区二区三 | 日韩午夜网站 | 日本激情视频中文字幕 | 视频三区| 亚洲精品一区二区三区在线 | 日本三级线观看 视频 | 欧美精品久久久久 | 久久久青草婷婷精品综合日韩 | 欧美日韩一区二区视频在线观看 | 欧美在线观看一区 | 国产精品99久久久久久www | 综合色久| 欧美一级小视频 | 亚洲国产欧美精品 |