国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 官方錯誤處理討論:用 ? 替代 if err != nil 可以不?

開發 前端
今天我們給大家帶來了 Go 核心團隊的錯誤處理新提案,老大哥 @Ian Lance Taylor 基于 Rust 的問號操作符作為靈感,設計出了 Go 的問號操作符和塊的聯動機制。

大家好,我是煎魚。

對于 Go 這一門編程語言,截至目前較大爭議話題仍在 if err != nil 在 Go 應用里所帶來的各種繁雜代碼,引起了社區很多正反方的探討。

原本以為 Go 核心團隊已經擺爛了。但最近老大哥 @Ian Lance Taylor 提出了一個新提案[1](后轉為討論[2]),引起了大量的社區交流:

圖片圖片

背景:為什么還要關注這件事?

在 Go 核心團隊的視野中,現階段對于處理 Go 錯誤處理的動力,個人理解至少來源于以下幾個主要原因,不斷地推動他們看到這件事。

第一是:社區中用代碼反饋最多的,也就是在現在的 Go 應用代碼中,存在較多的 if err != nil 的相關代碼:

func CopyFile(src, dst string) error {
 r, err := os.Open(src)
 if err != nil {
  return err
 }
 defer r.Close()

 w, err := os.Create(dst)
 if err != nil {
  return err
 }
 defer w.Close()

 if _, err := io.Copy(w, r); err != nil {
  return err
 }
 if err := w.Close(); err != nil {
  return err
 }
}

一堆的 if err != nil 代碼。

第二是:在歷年的 Go 開發人員調查報告中提示 “錯誤處理被列為人們今天使用的最大特定挑戰”。

如下圖所示:

圖片圖片

在調查結果中,有提到:“在封閉問題中,回答最多的是學習如何有效地編寫 Go(15%)和錯誤處理的冗長(13%)。”

第三是:在 Go issues 中存在大量的 Go 錯誤處理的各類提案,例如:

圖片圖片

  • 《proposal: Go 2: onerr return[3]》
  • 《proposal: Go 2: add or err: statement after function calls for error handling[4]》
  • 《proposal: Go 2: Use ?variable simplify handling of multiple-return-values[5]》

太多太多太多這類提案了。我也分享過很多腦洞很大的社區錯誤新提案。

新提案:? 新語法

這種新語法的部分靈感來源于:Rust 的問號運算符。

? 將會吸收函數返回的錯誤,并在錯誤不為 nil 時自動返回,這與之前的 try 的提議類似。

它的不同之處在于:? 是一個顯式語法元素,而不是對預先聲明函數的調用,而且 ? 只能出現在語句的末尾,不能出現在表達式的中間。

基本介紹

例如,原本的 Go 錯誤處理代碼如下:

r, err := SomeFunction()
 if err != nil {
  return fmt.Errorf("something failed: %v", err)
 }

新提案引入新的 ? 語法,將其改寫為如下:

r := SomeFunction() ? {
  return fmt.Errorf("something failed: %v", err)
 }

當然。如果是另外一種原本的寫法:

if err := SomeFunction2(); err != nil {
  return fmt.Errorf("something else failed: %v", err)
 }

也依然可以改寫為:

SomeFunction2() ? {
  return fmt.Errorf("something else failed: %v", err)
 }

? 這個用法將會吸收函數的錯誤結果。它引入了一個新塊,如果錯誤結果不為 nil,則執行該塊塊。

在新塊中,fmt.Errorf 里的標識符 err 指的是上述吸收的錯誤結果。也就是當塊跟在 ? 后面時,它會隱式聲明一個新的 err 變量。

完整例子

func Run() error {
 Start() ? // returns error from Start if not nil
 Wait() ?  // returns error from Wait if not nil
 return nil
}
func CopyFile(src, dst string) error {
 r := os.Open(src) ? {
  return fmt.Errorf("copy %s %s: %v", src, dst, err)
 }
 defer r.Close()

 w := os.Create(dst) ? {
  return fmt.Errorf("copy %s %s: %v", src, dst, err)
 }

 io.Copy(w, r) ? {
  w.Close()
  os.Remove(dst)
  return fmt.Errorf("copy %s %s: %v", src, dst, err)
 }

 w.Close() ? {
  os.Remove(dst)
  return fmt.Errorf("copy %s %s: %v", src, dst, err)
 }
}
func MustOpen(n string) *os.File {
 f := os.Open(n) ? {
  panic(err)
 }
 return f
}
func TestFileData(t *testing.T) {
 f := os.Open("testfile") ? {
  t.Fatal(err)
 }
 ...
}
func CreateIfNotExist(name string) error {
 f, err := os.OpenFile(name, os.O_EXCL|os.O_WRONLY, 0o666)
 if errors.Is(err, fs.ErrExist) {
  return nil
 }
 err ? // returns err if it is not nil
 // write to f ...
}

社區爭論

Go 錯誤處理機制這事,一向是正反雙方都有。有支持繼續保持的,也有反對的。

其中一位社區同學 @Michael Fridman 直接掏出了 Go 創始人 @Rob Pike 的演講 PPT 語錄:

圖片

該位同學表示:這一提議的優點有限 -- 它增加了另一種做事的方式,并使代碼更難閱讀(具有諷刺意味的是)。

其真心希望谷歌不會不惜一切代價發展 Go 語言,因為這將損害 Go 的長期用戶對 Go 的喜愛。

并且表示:“讓我們保持 Go 的簡單和無趣”

總結

今天我們給大家帶來了 Go 核心團隊的錯誤處理新提案,老大哥 @Ian Lance Taylor 基于 Rust 的問號操作符作為靈感,設計出了 Go 的問號操作符和塊的聯動機制。

關于 Go 的錯誤處理機制,我經歷很多。見到各種人做封裝,還有使用 pnaic+recover 來做 error 機制的。各種方法都有。誰都不服誰。

但是目前 Go1 還是陷入了一個非常尷尬的境地,有人希望改,有人不希望改。無論如何都難以 “討好” 全部人。

接下來就看新上任的 Go 核心團隊負責人的魄力如何了。能否像以前 rsc 力推 module 一樣背負罵名且用力推進。

畢竟,@Ian Lance Taylor 能提出這個提案和討論。很有可能就是內部先討論過的了。

參考資料

[1]提案: https://github.com/golang/go/issues/71203

[2]討論: https://github.com/golang/go/discussions/71460

[3]proposal: Go 2: onerr return: https://github.com/golang/go/issues/32848

[4]proposal: Go 2: add or err: statement after function calls for error handling: https://github.com/golang/go/issues/33029

[5]proposal: Go 2: Use ?variable simplify handling of multiple-return-values: https://github.com/golang/go/issues/33074

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

2020-12-17 06:25:05

Gopanic 模式

2025-07-29 01:11:00

2024-06-05 08:47:20

Go語言方式

2025-06-09 08:01:12

2023-03-10 08:48:29

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2022-07-13 08:53:28

函數Go語言

2022-08-01 08:48:39

Go代碼接口

2025-06-05 02:25:00

2024-02-28 08:54:57

switchGo錯誤

2024-03-14 09:35:54

Go 錯誤select代碼

2022-05-26 08:53:47

Go函數代碼

2022-06-13 07:03:25

Go 語言怎么優化重

2025-06-06 06:45:54

2021-09-13 07:53:31

Go錯誤處理

2025-03-31 00:29:44

2022-09-05 08:55:15

Go2提案語法

2025-09-05 01:55:00

Go并發錯誤項目

2025-06-30 09:49:11

點贊
收藏

51CTO技術棧公眾號

激情五月六月婷婷| 国产一区二区在线视频播放| 99热99re6国产在线播放| 国产成人在线视频网站| 青青草成人在线| 夜鲁夜鲁夜鲁视频在线播放| 婷婷成人激情在线网| 欧美极品少妇无套实战| 综合久久99| 午夜精品久久久久久久99热浪潮| 欧美另类tv| 欧洲亚洲国产日韩| 欧美成人影院在线播放| jvid福利写真一区二区三区| 精品不卡视频| 国产精品久久一| 1313精品午夜理伦电影| 全黄性性激高免费视频| 亚洲欧美日韩国产综合| 亚洲最新合集| 亚洲国产精品一区制服丝袜| 国产美女无遮挡网站| 久久先锋资源网| 在线观看国产成人av片| 国产女主播在线写真| 91超碰国产精品| 欧美黑人又粗又大又爽免费| 欧美综合二区| 国产日本欧美在线观看 | 国产日韩一区二区三免费高清 | 欧美在线不卡视频| 国产黄视频在线观看| 美女脱光内衣内裤视频久久网站 | 香蕉视频一区| 亚洲色图第一区| 国产福利一区视频| 国产成人精品一区二| 日韩精品欧美在线| 国产精品一区毛片| 美女一区视频| 欧美亚洲专区| 快播日韩欧美| 噜噜噜躁狠狠躁狠狠精品视频 | 久久久久99精品国产片| 亚洲熟妇无码一区二区三区| 国产99久久久国产精品| 老司机午夜网站| 国产69精品一区二区亚洲孕妇| 无码人妻精品一区二区三区99v| 蜜桃视频在线观看一区| 超级碰在线观看| 久久精品一区二区三区av| 亚洲污视频在线观看| 国产精品电影一区二区三区| 成年人黄视频网站| 亚洲成人激情综合网| jizz视频在线观看| 欧美精品一区二区三区视频| 性欧美1819sex性高清| 在线看小视频| 亚洲一线二线三线视频| 国产成免费视频| 欧美主播一区二区三区美女| 三级资源在线| 久久久极品av| 日韩精品中文字幕第1页| 含羞草久久爱69一区| 美女视频一区二区| 日本中文字幕片| 亚洲mv在线观看| 少妇av在线| 欧美www在线| 久久国产成人精品| 亚洲精品永久www嫩草| 99精品视频在线免费观看| 免费看黄视频网站| 欧美日韩免费不卡视频一区二区三区| 色偷偷偷在线视频播放 | 日漫免费在线观看网站| 日韩欧美激情在线| 96视频在线观看欧美| 国产精品综合网站| 久久精品久久99精品久久| 国产精品一区二区小说| 在线中文字幕不卡| 日韩一级二级| 91丨九色丨国产在线| 国产一区二区三区黄视频 | 日韩欧美一区免费| 久久精品日产第一区二区三区乱码 | 国产综合一区二区| 在线观看免费黄网站| 欧美三级欧美一级| 日本午夜免费一区二区| 91精品视频免费观看| 粉嫩13p一区二区三区| h精品动漫在线观看| 亚洲国产精品人人爽夜夜爽| 久久夜色电影| 亚洲人一区二区| 亚洲国产sm捆绑调教视频| 男人天堂视频在线观看| 国产精品电影网站| 国产精品一级二级三级| 天天射综合网站| xxxx欧美18另类的高清| 国精品一区二区三区| 国产xxxxx视频| 精品粉嫩超白一线天av| 欧美亚洲激情| 国产日产欧美视频| 精品久久久久久久久久久久久久久久久| 久久精品66| 日韩一级免费看| 欧美蜜桃一区二区三区| 伊人久久大香线蕉无限次| 国产专区在线视频| 91精品国产一区二区三区蜜臀 | 欧美午夜不卡| 欧美裸体在线版观看完整版| 妺妺窝人体色www在线小说| www.日韩大片| 免费a级在线播放| 91av在线免费观看| 国产高清亚洲一区| 在线激情网站| 91精品在线影院| 国产日韩v精品一区二区| 日韩av一级| 亚洲网友自拍| 成人激情在线观看| 亚洲电影在线看| 国产一区二区三区91| 成人av在线不卡| 精品少妇一区二区三区在线视频| 综合激情婷婷| 人人澡人一摸人人添| 日韩在线观看免费高清完整版 | 伊人成人开心激情综合网| 午夜亚洲精品| 免费理论片在线观看播放老| 欧美最猛性xxxxx免费| 久久精品视频免费| 日韩电影精品| 日韩精品在线中文字幕| 亚洲国产日韩欧美在线图片| 亚洲经典在线| 成人免费视频网站入口| 狠狠综合久久av| 亚洲欧洲三级电影| 亚洲欧美日韩综合aⅴ视频| 日韩国产欧美一区二区| 国产精品嫩草视频| 国产精品国产精品国产专区不片| 亚洲精品555| 乱熟女高潮一区二区在线| 精品国产乱码久久久久久闺蜜| 99精品国产福利在线观看免费| 成人综合影院| 久久精品国产综合精品| 91麻豆精品国产91久久久久久| 一区二区三区国产在线| 黄色成人在线观看| 色综合666| 亚洲欧洲日本专区| 成人中文字幕电影| 久久国产精品美女| 拍拍拍999自拍偷| 国产精品欧美日韩久久| 色94色欧美sute亚洲线路一ni| 亚洲成av人片一区二区密柚| 久久视频www| 日本10禁啪啪无遮挡免费一区二区| 亚洲欧洲综合| 中文字幕一区在线观看视频| 国产成人av| 亚洲精品永久www嫩草| 日韩成人中文字幕| 国产一区二区免费在线| 成人在线视频播放| 免费在线激情视频| 668精品在线视频| 九色丨porny丨| 国产专区在线视频| 高潮按摩久久久久久av免费| 久久精品亚洲精品| 久久久999视频| 久久国产一区二区三区| 午夜欧美视频| 77导航福利在线| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 在线观看久久久久久| 亚洲视频你懂的| 亚洲手机在线| 亚洲欧美一区二区三区| 天天色综合6| 久久综合一区二区三区| 日韩中文视频免费在线观看| 亚洲午夜精品网| 六月丁香婷婷久久|