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

Go 錯誤處理:用 select-case 來解決這個歷史難題?

開發 前端
截止目前我們已經看過了許多 Go 錯誤處理的腦洞新提案。本提案是期望利用 select-case 的特性結構來做擴展,以此達到向前兼容的目的。從編譯和運行上,作者認為代價是比較小的,只需要在內部替換成類似 switch 的效果就可以了。

大家好,我是煎魚。

日常看 Go 社區的一些新動態,發現大家對于錯誤處理的新提案是很積極。上次分享了一篇想要用 switch-case 來解決現狀的新提案,不少同學認為不可行。

沒想到 Go 社區的同學腦洞還是很大的,這幾天又整出來個 select-case 的新提案的方式來解決錯誤處理。

今天基于此給大家分享一下社區里的新腦洞。

快速背景

本節的背景主要是給不了解的同學拉通一下。如果已經知道的可以跳過本節。新提案的提出背景,與之前的類似。

社區內的 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
 }
 // 和煎魚一起煎個魚...
}

要寫比較多的判斷和返回錯誤的邏輯,并且這些代碼比正式的調用代碼還要多。所以也常被人戲稱一個 Go 工程里 80% 都是 if err != nil 等錯誤檢查代碼。

新提案

本次新提案是由 @bjorndm 提出的 《proposal: Go 2: add trap on direct assignment with select block[1]》:

圖片圖片

提出者本身使用編程語言的經驗比較豐富,用過:C, Ruby, Pascal, Basic, Java, Shell 等。本次提出該提案的原因是某些 shell 中 trap 語句的啟發。

抽象了一下,提案內容如下:

  1. 功能上是要擴展 select 關鍵字的語法,允許在 select 關鍵字和其代碼塊之間放一個單獨的變量,這會在變量上安裝一個 “陷阱”(類似觸發器)。
  2. 這個 “陷阱” 是關鍵點,當任何值被賦給該變量時將會觸發。然后在 select 代碼塊的主體中,case 語句可用于檢查變量的值。

從原作者的描述來看,提案內容比較生硬。我們結合演示代碼來看就知道,他是想構思什么新語法來使用 select-case 達到錯誤處理的目的了。

演示代碼如下:

func CanFail(name string) error {
var err error
select err {
      case err != nil:
          return fmt.Errorf("CanFail: %w", err)
}

fin, err := os.Open(name)

buf, err := io.ReadAll(fin)

return nil
}

結合新提案的語法,由于 select 代碼塊中是一個變量,符合新語法 “陷阱” 的場景。

因此 err 變量被安裝了 “陷阱”,當后面的 os.Open 和 io.ReadAll 等方法賦值給 err 變量時,就能觸發 select 子句的 case 檢查。

最終以此達到簡化 if err != nil 的目的。也可以滿足 Go1 兼容性保障,達到向前和向后兼容,不需要新增關鍵字。

總結

截止目前我們已經看過了許多 Go 錯誤處理的腦洞新提案。本提案是期望利用 select-case 的特性結構來做擴展,以此達到向前兼容的目的。

從編譯和運行上,作者認為代價是比較小的,只需要在內部替換成類似 switch 的效果就可以了。

參考資料

[1]proposal: Go 2: add trap on direct assignment with select block: https://github.com/golang/go/issues/66161

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

2024-02-28 08:54:57

switchGo錯誤

2022-07-13 08:53:28

函數Go語言

2023-03-10 08:48:29

2022-08-01 08:48:39

Go代碼接口

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2020-12-17 06:25:05

Gopanic 模式

2025-02-24 09:30:15

2022-05-26 08:53:47

Go函數代碼

2024-06-05 08:47:20

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提案語法

2024-03-27 08:18:02

Spring映射HTML

2025-03-31 08:57:25

Go程序性能

2021-09-27 15:33:48

Go 開發技術

2023-10-26 15:49:53

Go日志

2021-09-27 23:28:29

Go多協程并發

2021-09-27 10:04:03

Go程序處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99精品国产一区二区三区 | 99视频在线免费观看 | 国产在线永久免费 | 毛片在线免费 | 男女羞羞视频大全 | 在线观看视频h | 亚洲精品一 | 日日干夜夜操天天操 | 欧美一级黄色片在线观看 | 黑人精品欧美一区二区蜜桃 | 激情小视频 | 精品视频一区二区三区在线观看 | 国产精品a久久久久 | 日日骚网 | 在线观看日本网站 | 亚洲久草 | 免费精品| 一区二区精品在线 | 午夜精品久久久 | 亚洲高清一区二区三区 | 欧美性生活一区二区三区 | aaaa网站| 久久精品国产亚洲 | 91极品视频 | 欧美一区二区免费在线 | 91免费版在线观看 | 九色av | 91精品国产高清久久久久久久久 | 日本黄色免费视频 | 亚洲国产精品99久久久久久久久 | 中文字幕一区二区三区在线乱码 | 激情婷婷| 美女久久| 97久久精品午夜一区二区 | 国产成人精品午夜 | 日韩在线免费视频 | 午夜亚洲 | 一级黄色片美国 | 美女久久 | 国产欧美精品在线 | 一区二区三区在线观看视频 |