在比較一段長的時間里,Go 的錯誤處理已經沒有什么特別的進展和新改進了。看著已經到了瓶頸期。
今天在 GitHub 上學習時,看到 Go 社區里有人提了個錯誤處理的優化提案《proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar》,也是引入新的語法來解決該問題。
大家一起來看看,也集思廣益一下。原提案作者的目的是新增一個 listen 關鍵字和配合管道符等語法來實現新的錯誤處理。
原本的 Go1 代碼,我們在處理錯誤時需要使用 if err != nil。如下代碼:
func copy(src, dst string) (int64, error) {r, err := os.Open("input.txt")if err != nil {return 0, err}defer r.Close()w, err := os.Create("output.txt")if err != nil {return 0, err}defer w.Close()if _, err = io.Copy(w, r); err != nil {return 0, err}return 0, err }
本提案的變化是:新增一個 listen 關鍵字,用于監聽 err 變量,再配合 "|" 管道符來實現新的錯誤處理機制。
如下演示代碼:
listen: err {if err != nil {return 0, err}return 0, nil }()func copy(src, dst string) (int64, error) {listen:r, err := os.Open("input.txt")defer r.Close()w, err := os.Create("output.txt")defer w.Close()_, err = io.Copy(w, r) }
listen 關鍵字監聽了 err 變量,再在上述的代碼塊中進行統一的錯誤邏輯處理。
如果是多個 err 變量,會是如下處理方式:
listen: err | err2 {if err != nil {return 0, err}return 0, nil }()
增加了管道符,同時對 err 和 err2 變量進行監聽和處理。
本提案還在等待作者補充更多的語言變更的實現細節。不過截至目前為止,吐槽是不少的。
大家對此有沒有更好的建議和想法呢?
Go 的新錯誤處理的改造方向真的是讓人頭大。我這邊有記載被 ban 的錯誤處理合集都已經有許多了。停滯不前中。
文章持續更新中