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

Go 錯誤處理的爭論,終于有了結論!

開發 前端
實際上 Go 這一門編程語言的 Go 錯誤處理機制,一直處于用戶調查中的風頭浪尖。但是會在互聯網上發聲的僅僅是一部分人。

大家好,我是煎魚。

對于 Go 這一門編程語言,Go 核心團隊的成員自己心里也非常有數,持續最久的吐槽就是錯誤處理的冗長。

當然,從我們的角度來看,社區還存在對于 Go 錯誤處理現有機制不滿意的情況。

近期 Go 官方發表了《[ On | No ] syntactic support for error handling[1]》正式宣布對錯誤處理機制的想法和后續表態。今天分享給大家。

Go1 錯誤處理的 “冗長” 例子

Go 的 if err != nil 的最短例子如下:

x, err := call()
if err != nil {
        // handle err
}

更常見的代碼例子如下:

func printSum(a, b string) error {
    x, err := strconv.Atoi(a)
    if err != nil {
        return err
    }
    y, err := strconv.Atoi(b)
    if err != nil {
        return err
    }
    fmt.Println("result:", x + y)
    return nil
}

這個函數大概只有 10 余行,但是實際上只有 3-4 行在實際上做邏輯調用和處理,剩余的 6 行都在處理 err 變量的冗余。

這樣的冗長,就是為什么有關錯誤處理的吐槽排在每年的 Go 開發者調查報告前列的緣由。

圖片圖片

這樣一看,其實就是 Go1 自帶的錯誤處理方式和機制,就是會被一部份同學瘋狂吐槽的(也有支持的)

圖片圖片

非常見仁見智了。

Go 核心團隊的多輪嘗試

Go 核心團隊瘋狂表示多人在多年做過多輪的積極嘗試。

最早可以追溯到 2018 年,時任團隊負責人的 @Russ Cox 想將該問題的優化放進 Go2 的大籃子里一起解決了。

團隊中的 @Marcel van Lohuizen 提出了《Error Handling — Draft Design[2]》的提案,示例代碼如下:

// printSum implementation using the proposed check/handle mechanism.
func printSum(a, b string) error {
    handle err { return err }
    x := check strconv.Atoi(a)
    y := check strconv.Atoi(b)
    fmt.Println("result:", x + y)
    return nil
}

但,這被認為太復雜。又沒有辦法繼續推進。僵持住了。

隨后在 2019 年,根據新的 try 提案《Proposal: A built-in Go error check function, try[3]》又做了改善。

示例代碼如下:

// printSum implementation using the proposed try mechanism.
func printSum(a, b string) error {
    // use a defer statement to augment errors before returning
    x := try(strconv.Atoi(a))
    y := try(strconv.Atoi(b))
    fmt.Println("result:", x + y)
    return nil
}

但是由于在出現錯誤時,可能會出現在深度嵌套誘發 try,以及 try 會打亂控制流的問題。導致許多人我無法接受 try 提案。并成功被稱為:“臭名昭著”。最終被迫放棄。

又經過多年的折騰,@Ian Lance Taylor 參考 Rust 發布了新的提案《proposal: spec: reduce error handling boilerplate using ?[4]》。

示例代碼如下:

// printSum implementation using the proposed "?" statements.
func printSum(a, b string) error {
    x := strconv.Atoi(a) ?
    y := strconv.Atoi(b) ?
    fmt.Println("result:", x + y)
    return nil
}

實際上 @Ian Lance Taylor 還做了小型的用戶實操實驗,當時絕大部分參與者都能夠意識到 ? 的作用是什么。他才敢放心(有信心)繼續推進。

但是依然很不幸,這個提案依然被很多的建議和想法給淹沒。沒法得出一個最終的最優解。

由此,Go 核心團隊的 10+ 年對于錯誤處理機制探討的推進。被迫暫告一段落。甚至引發了 Go 團隊很多的 “反思”。

最終結論(階段性)

Go 核心團隊認為,其在過去那么多年,一共提出了 3 個成熟的提案和數百個社區提案。但是這些所有的提案,都未能夠得到足夠的社區支持。

最終(2025 年)Go 官方將決定停止嘗試解決錯誤處理機制的問題。給出的理由是提案流程里的:

圖片圖片

“提案流程的目標是及時就結果達成普遍共識。如果提案審查無法在問題跟蹤器上的問題討論中達成普遍共識,通常的結果就是拒絕提案。”

同時有兩個非常扎心的事實:

  • 截止至目前,沒有任何一個錯誤處理提案達成共識。全部無一例外都被拒絕了。
  • Google Go 團隊的資深成員們,也沒有達成最佳的前進共識。(沒有強而有力的共識)

說白了。就是搞不定。沒有最佳的錯誤處理方式。且消耗了太大的精力和時間,官方團隊自己也沒有達成共識。

圖片圖片

在 2025 年 6 月做出了最終的決定:“在可預見的將來,Go 語言團隊將停止針對錯誤處理的語法修改。我們還將關閉所有主要涉及錯誤處理語法的開放式提案和新提案,不再進行進一步調查。”

總結

實際上 Go 這一門編程語言的 Go 錯誤處理機制,一直處于用戶調查中的風頭浪尖。但是會在互聯網上發聲的僅僅是一部分人。

但在現實和其他沒發聲的人里,也有很多支持 Go 不需要改變語法,直接還是用現在的 if err != nil 。也是存在非常多的支持者。(這一點官方在 Google Cloud Next 2025 做了個小型聚會進行了相關討論)

從現實來講,Go 核心團隊感覺非常想找到一個完美的錯誤處理機制,但現階段來看,正因為想一碗水都端平。似乎都無法解決。可能還是需要當年 rsc 力推 go module 時的決心。

但很可惜,現在和社區最為親近的 ian 也已經離職了,一時半會肯定不會有所改善的了。

參考資料

[1] [ On | No ] syntactic support for error handling: https://go.dev/blog/error-syntax

[2] Error Handling — Draft Design: https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling.md

[3] Proposal: A built-in Go error check function, try: https://go.googlesource.com/proposal/+/master/design/32437-try-builtin.md

[4] proposal: spec: reduce error handling boilerplate using ?: https://github.com/golang/go/issues/71203

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

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

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

2021-09-27 15:33:48

Go 開發技術

2023-10-26 15:49:53

Go日志

2020-12-17 06:25:05

Gopanic 模式

2021-09-27 23:28:29

Go多協程并發

2021-09-27 10:04:03

Go程序處理

2017-09-22 15:25:40

Go語言其他語言錯誤處理

2023-03-10 08:48:29

2021-04-14 07:08:14

Nodejs錯誤處理

2024-02-28 08:54:57

switchGo錯誤

2024-03-27 08:18:02

Spring映射HTML

2022-07-13 08:53:28

函數Go語言

2025-02-24 09:30:15

2013-01-22 10:54:51

HTML5App移動應用

2022-08-01 08:48:39

Go代碼接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本精品视频在线 | 欧美一级黄色免费看 | 日韩中文字幕在线观看 | 一级毛片免费看 | 亚洲免费观看视频网站 | 亚洲欧美日韩电影 | 日韩第一页 | 欧美日韩综合精品 | 久久成人激情 | 国产午夜精品一区二区三区嫩草 | 午夜伊人| 日韩欧美国产成人一区二区 | 99精品一区 | 亚洲免费视频一区 | 中文字幕亚洲区一区二 | 久久久91精品国产一区二区三区 | 久久草视频 | 久久久久黄色 | 免费视频一区 | 91精品久久久久久久久 | 国产精品美女久久久久aⅴ国产馆 | 色中文在线 | 欧美日韩在线电影 | 狠狠操电影 | 一区二区三区免费 | 日韩乱码av| 久久久国产精品 | 亚洲一区欧美一区 | 国产激情在线 | 久久日韩粉嫩一区二区三区 | 久久久久久久久久久久久9999 | 91视频在线观看免费 | 精品国产免费一区二区三区演员表 | 午夜综合| 一区免费观看 | 夜夜摸天天操 | 色视频网站在线观看 | 国产特级毛片 | 国产精品久久久久久久久久了 | 精品国产一区二区三区久久狼黑人 | 国产成人99av超碰超爽 |