Go 為什麼不像 Rust 用 ?!做錯誤處理?
大家好,我是煎魚。
之前每次寫 Go 錯誤處理的相關提案時,大家都會在評論區探討到一個事。
Go 這活不得勁,常被戲稱,一個大型 Go 工程專案裡 60% 的程式碼都是 if err != nil
。
我們們錯誤處理怎麼不借鑑一下 Rust,高低也整個問號的語法特性,就可以簡化這三行了,不香嗎?
借鑑 Rust 用 ?!| 符號
核心的點是在現有的 Go 例子中,我們一般要寫 if err != nil
,多了之後又多又雜看起來還有些麻煩。
如下 Go 程式碼:
count, err = fd.Write(bytes)
if err != nil {
return nil, err
}
如果我們也借鑑 Rust 使用 ! 和 ?的簡化版,我們可以演進為如下程式碼:
count := fd.Write!(bytes)
count := fd.Write(bytes)!
count := fd.Write(bytes)?
也有大佬提到可以演進一下使用 || 變成:
fd.Write(bytes) || Expr
不管如何,就是不需要寫三行的 if err != nil
去處理這個硬邏輯,只要加個符號(類似語法糖)就行,由編譯器和執行時自己去處理就完了。
這類提案都會被拒絕
為什麼最後 Go 沒有落地呢?
普遍社群中參與討論的大佬認為,新的語法糖相較 if err != nil
,會增加認知和理解程式碼的開銷,並降低程式碼可讀性。
這些神奇的的功能和符號,他們是隱秘的,更容易讓人錯過,會導致程式控制流邏輯發生改變,增加程式設計師的心智負擔。
Go 初學者也需要額外掌握這幾個符號的理解和應用,有新的學習成本。
這類提案會被直接拒絕,請大家不要再幻想了。
希望開發者自己定模板
如果只是為了解決那 3 行程式碼,部分大佬表示 Go 開發者應該自己定義錯誤模板。而不是藉助引入更多的新語法來解決,這也不符合 Go 語言對 “less is more” 的理念定義。
從現在對 Go 錯誤處理的多個提案討論和社群交流來看,Go 在這塊已經陷入僵局,很像工作中的什麼呢?
像我們常提的既要也要還要,重要的是這事 ROI 也不夠高,導致Go 核心團隊的動力不足,也不想互相得罪了。
只能甩出一句經典:”讓 Rust 特性留給 Rust“。
總結
Go 錯誤處理 if err != nil
的解決,已經成為了一塊燙手的山芋,怎麼改都不討好了,相關負責人積極討論,實施持續擺爛中,沒有新的建設。
根據以往在依賴管理的,我猜測最終大機率會由 Go 團隊大當家 Russ Cox 操刀,否則很難有人能力挽狂瀾。不過,目前來看他對此並不感興趣。對於開啟 Go 工具鏈遙測的提案,也剛吃了閉門羹。
錯誤處理的碰撞,真是 Go 的一生之敵。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2938985/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go 錯誤處理Go
- 學習Rust 錯誤處理Rust
- go的錯誤處理Go
- rust學習十、異常處理(錯誤處理)Rust
- Go語言之錯誤處理Go
- go 錯誤處理設計思考Go
- 從錯誤處理看 Rust 的語言和 Go 語言的設計RustGo
- Go 的錯誤處理策略 筆記Go筆記
- Go 併發 2.2:錯誤處理模式Go模式
- [譯] Go 1.13 errors 包錯誤處理GoError
- Go語言基礎-錯誤處理Go
- Go語言錯誤處理機制Go
- 開心檔之Go 錯誤處理Go
- Rust中錯誤處理的最簡單指南Rust
- 二、GO 程式設計模式:錯誤處理Go程式設計設計模式
- 錯誤處理
- Go 錯誤處理新思路?用左側函式和表示式Go函式
- 在vue使用異常處理做錯誤提示Vue
- 兄弟連go教程(15)函式 - 錯誤處理Go函式
- Laravel 統一錯誤處理為 JSONLaravelJSON
- 如何在 Go 中優雅的處理和返回錯誤(1)——函式內部的錯誤處理Go函式
- 優化 Go 錯誤處理,魔改 Go recover 靠譜嗎?優化Go
- 應用中的錯誤處理概述
- Python錯誤處理Python
- PHP 錯誤處理PHP
- php錯誤處理PHP
- Go 錯誤處理指北:Defer、Panic、Recover 三劍客Go
- 錯誤處理:如何通過 error、deferred、panic 等處理錯誤?Error
- go-carbon 1.2.6 版本釋出,優化錯誤處理機制,棄用出錯直接panic的粗暴處理方式Go優化
- 為什麼Discord從Go切換到Rust?GoRust
- 深入 Go 的錯誤處理機制,學會如何使用Go
- 深入 Go 的錯誤處理機制,理解設計思想Go
- 寫給go開發者的gRPC教程-錯誤處理GoRPC
- openGauss 處理錯誤表
- axios 的錯誤處理iOS
- go-carbon 1.2.6 版本釋出,最佳化錯誤處理機制,棄用出錯直接panic的粗暴處理方式Go
- 清華尹成帶你實戰GO案例(24)Go 錯誤處理Go
- 以客戶端為中心的錯誤處理客戶端