日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

用 Switch-case 來解決 Go 錯誤處理的難題?

來源: 責編: 時間:2024-02-29 14:40:45 178觀看
導讀大家好,我是煎魚。在 Go 這門編程語言中,if err != nil 的錯誤處理方式,是我們一直關注的焦點之一。所有的 Go 社區調查中,都有希望優化和改進錯誤處理的聲音和各種想法。春節期間刷到了一個由 @Bill Soudan 提出的新提案

大家好,我是煎魚。1Dh28資訊網——每日最新資訊28at.com

在 Go 這門編程語言中,if err != nil 的錯誤處理方式,是我們一直關注的焦點之一。所有的 Go 社區調查中,都有希望優化和改進錯誤處理的聲音和各種想法。1Dh28資訊網——每日最新資訊28at.com

春節期間刷到了一個由 @Bill Soudan 提出的新提案《proposal: Go 2: support new form of switch statement during variable assignment which jumps to function-wide case blocks[1]》,是針對錯誤處理優化的,思路還是有些新奇的。1Dh28資訊網——每日最新資訊28at.com

圖片圖片1Dh28資訊網——每日最新資訊28at.com

以往印象里沒有人提過這個方式。今天分享給大家,一起圍觀和學習!1Dh28資訊網——每日最新資訊28at.com

新提案

該提案希望在變量賦值時能夠支持新的 switch 語句形式。從功能出發,更具體指的是:要支持 switch 跳轉到函數范圍內的任意位置的標簽。1Dh28資訊網——每日最新資訊28at.com

這個特性的目的是:簡化繁瑣又重復的 if err !=nil 的錯誤檢查代碼,也可以用于其他邏輯實現。1Dh28資訊網——每日最新資訊28at.com

具體的對比例子如下。1Dh28資訊網——每日最新資訊28at.com

如果是原本的 Go1 錯誤處理的范式。1Dh28資訊網——每日最新資訊28at.com

代碼如下:1Dh28資訊網——每日最新資訊28at.com

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 等錯誤檢查代碼。1Dh28資訊網——每日最新資訊28at.com

基于本文提到的 switch-case 提案進行改造。1Dh28資訊網——每日最新資訊28at.com

新的代碼如下:1Dh28資訊網——每日最新資訊28at.com

func CopyFile(src, dst string) error { r, switch err := os.Open(src) defer r.Close() w, switch err := os.Create(dst) defer w.Close() _, switch dstErr := io.Copy(w, r) switch dstErr = w.Close() return nilcase dstErr != nil: os.Remove(dst) err = dstErr fallthroughcase err != nil: return fmt.Errorf("copy %s %s: %v", src, dst, err)}

注意幾個細節點:1Dh28資訊網——每日最新資訊28at.com

  • switch 關鍵字在對應的 err 變量前作為聲明標識。
  • case 關鍵字根據對應的 err 變量,運行不同的錯誤處理邏輯。
  • switch-case 子句可以在同一函數內的不同位置進行調用。

這種 switch-case 的使用方式,從優點來看。確實收攏了統一的錯誤處理邏輯,減少了重復繁瑣的代碼量。1Dh28資訊網——每日最新資訊28at.com

短短的代碼片段,看起來像那么一回事,能一定程度上滿足大家原始的訴求。1Dh28資訊網——每日最新資訊28at.com

缺點的話,個人認為會增加認知和邏輯復雜度。你根本不知道 switch-case,這個 case 他的準確邏輯位置在哪里。1Dh28資訊網——每日最新資訊28at.com

一旦有人套娃,就非常麻煩了。同時 switch-case 延伸出多種不同的使用方式,會產生二義性,這是一個折騰的事情。1Dh28資訊網——每日最新資訊28at.com

總結

今天給大家分享了我所看到的一個 Go 錯誤處理的新提案,其本質上是利用 switch-case 的新語法機制,實現了 err 變量和 case 的關聯。以此簡化錯誤檢查的邏輯。1Dh28資訊網——每日最新資訊28at.com

軟件開發是沒有銀彈的。如何引入更優雅的錯誤處理機制,且不要帶過來過大的程序員心智負擔,還要要確保編譯器性能尚可。Go 核心團隊可能是想要在這三個圈里設計一個最優的選擇。1Dh28資訊網——每日最新資訊28at.com

參考資料1Dh28資訊網——每日最新資訊28at.com

[1]1Dh28資訊網——每日最新資訊28at.com

proposal: Go 2: support new form of switch statement during variable assignment which jumps to function-wide case blocks: https://github.com/golang/go/issues/650191Dh28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-75316-0.html用 Switch-case 來解決 Go 錯誤處理的難題?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 在DDD集成支付寶支付,看這篇文章就夠了!

下一篇: 想徒手寫個文件系統?來一起呀

標簽:
  • 熱門焦點
  • 一加Ace2 Pro真機揭曉 鈦空灰配色質感拉滿

    終于,在經過了幾波預熱之后,一加Ace2 Pro的外觀真機圖在網上出現了。還是博主數碼閑聊站曝光的,這次的外觀設計還是延續了一加11的方案,只是細節上有了調整,例如新加入了鈦空灰
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

    前言在使用SpringBoot開發中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 電視息屏休眠仍有網絡上傳 愛奇藝被質疑“薅消費者羊毛”

    記者丨寧曉敏 見習生丨汗青出品丨鰲頭財經(theSankei) 前不久,愛奇藝發布了一份亮眼的一季報,不僅營收和會員營收創造歷史最佳表現,其運營利潤也連續6個月實現增長。自去年年初
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了——貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己“當家”的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
Top 主站蜘蛛池模板: 江津市| 盱眙县| 内黄县| 新沂市| 普安县| 余姚市| 南陵县| 扎鲁特旗| 和林格尔县| 红桥区| 平利县| 珠海市| 平江县| 平定县| 延庆县| 寻甸| 河南省| 阿合奇县| 义乌市| 马关县| 江城| 日土县| 邢台县| 潍坊市| 洪江市| 扶绥县| 澎湖县| 肃南| 额敏县| 浮山县| 炉霍县| 黄骅市| 秀山| 鹤庆县| 德兴市| 迁安市| 岑巩县| 桑植县| 江达县| 高尔夫| 革吉县|