<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      Go作者忍了10年的if err != nil

      0
      分享至


      Go的錯誤處理寫了10年,你數過自己在代碼里敲過多少次if err != nil嗎?

      一位開發者算過:一個中等規模的項目,這行代碼能出現上千次。不是業務邏輯,是機械勞動。

      Go團隊對此的態度一直很明確——顯式比隱式好。但顯式的代價是:當控制流復雜起來,業務代碼會被埋進重復的錯誤檢查里。這就像你每次出門都要手動檢查門窗鎖沒鎖,鎖是對的,但檢查100次就是折磨。

      最近一個名為go-opera的輕量庫在GitHub上引起討論。它不試圖推翻Go的設計哲學,而是用Result類型和鏈式調用,把錯誤處理從"填空題"變成"選擇題"。

      Go的錯誤處理,到底卡在哪

      go-opera的作者在文檔里列了三個具體痛點。第一個很多人沒意識到:Go函數失敗時,必須返回一個零值湊數。

      這個零值通常是填充物,增加噪音,而非意義。

      比如加載用戶的函數,ID為空時得返回一個空的User結構體:

      func loadUser(id string) (User, error) {if id == "" {return User{}, errors.New("empty id")return User{ID: id}, nil

      User{}這個空殼子從不會真正使用,但編譯器逼你寫。在復雜場景里,構造這些零值本身就是心智負擔。

      第二個痛點更隱蔽:Go支持多返回值,但不支持直接傳遞。你想把parsePort的結果喂給openServer?不行,得先 unpacking。

      func parsePort() (int, error) {return strconv.Atoi("8080")func openServer(port int) error {return nilfunc main() {// 編譯報錯openServer(parsePort())

      函數式編程里的compose在Go里寸步難行。每個中間步驟都要打斷流程,聲明臨時變量,檢查錯誤,再繼續。代碼的"節奏感"被切得支離破碎。

      第三個痛點是規模問題。當函數有多個步驟,你會看到err、err2、err3或者反復 shadow 的err:

      func tooManyErrors() error {val1, err1 := errFunc1()if err1 != nil {return fmt.Errorf("step 1 failed: %w", err1)val2, err2 := errFunc2(val1)if err2 != nil {return fmt.Errorf("step 2 failed: %w", err2)// ... 重復到 step 4

      另一種寫法是用同一個err變量,靠作用域 shadow:

      func process() error {data, err := readFile()if err != nil {return errif err := validate(data); err != nil {return err

      這是Go的慣用寫法,但閱讀成本不低。步驟一多,函數就變成了"錯誤記賬本"——業務邏輯和錯誤處理纏在一起,改一處要牽三處。

      go-opera的解法:把錯誤變成"一等公民"

      go-opera的核心是一個Result類型,包裹值或錯誤,但不同時存在。靈感來自Rust和EffectTS,但做了Go化的適配。

      作者的原話是:「目標不是隱藏錯誤,而是讓錯誤傳播更易讀、更易組合、更少重復。」

      基本用法看起來像這樣。函數返回Result而不是(value, error)對:

      func loadUser(id string) result.Result[User] {if id == "" {return result.Err[User](errors.New("empty id"))return result.Ok(User{ID: id})

      調用方用鏈式方法處理,不用寫if判斷:

      user := loadUser("123").Map(func(u User) User { /* 轉換 */ }).Filter(func(u User) bool { /* 過濾 */ }).OrElse(func() User { /* 默認值 */ })

      關鍵操作包括:Map(成功時轉換)、FlatMap(鏈式調用可能失敗的函數)、Filter(條件過濾)、OrElse(失敗時兜底)。錯誤會自動穿透,不用手動傳遞。

      Do notation是另一個設計。它用閉包包裹多步操作,自動處理提前返回:

      result := result.Do(func() result.Result[User] {user := result.Unwrap(loadUser("123"))config := result.Unwrap(loadConfig(user.ID))return connectServer(config)

      Unwrap在Result為Err時會提前終止整個Do塊,把錯誤帶出去。寫法上像同步代碼,行為上是自動的錯誤傳播。

      爭議點:這是進步還是糖衣

      GitHub上的討論分成了兩派。支持方認為,go-opera在保持顯式的前提下,把機械勞動交給了庫——你仍然能看到錯誤在哪傳播,只是不用寫第1000個if err != nil。

      反對方的質疑更尖銳:Result類型在Go里是運行時包裝,有內存分配開銷;鏈式調用調試時堆棧更深;團隊里有人不熟悉這個模式,代碼就變成了"方言"。

      一位評論者寫道:「Go的錯誤處理是啰嗦,但所有人都用同一種方式啰嗦。引入新抽象,解決的是書寫痛苦,增加的是理解成本。」

      作者對此的回應是分層使用:核心路徑用Result消除噪音,邊界處轉回原生error保持兼容。不是非此即彼,而是"在摩擦最大的地方涂潤滑油"。

      性能方面,簡單benchmark顯示Result包裝在熱路徑上有輕微開銷,但作者強調這屬于"可優化的實現細節",而非設計缺陷。

      一個值得玩味的細節

      go-opera的文檔里埋了一句作者的觀察:很多Go開發者其實已經在用類似模式,只是各自手寫——有的用結構體包裝,有的用panic-recover模擬,有的干脆把錯誤攢到最后一起處理。

      這些"民間方案"往往不兼容、不透明、難以維護。go-opera試圖提供一個最小共識:200行代碼,零依賴,標準庫風格。

      它不會進入Go標準庫,也不太可能改變Go 2的設計方向。但對于那些每天在if err != nil里掙扎的開發者,它提供了一個可以立刻用的選項——不是答案,是選擇。

      你會在自己的項目里引入這種Result模式,還是繼續相信"顯式重復"本身就是一種文檔?

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      掘金18分逆轉開拓者,賽后楊瀚森的鏡頭引熱議!他獲得約基奇認可

      掘金18分逆轉開拓者,賽后楊瀚森的鏡頭引熱議!他獲得約基奇認可

      球場沒跑道
      2026-04-07 12:28:54
      國際奧委會禁止跨性別運動員參賽,美國女足傳奇拉皮諾埃非常不滿

      國際奧委會禁止跨性別運動員參賽,美國女足傳奇拉皮諾埃非常不滿

      懂球帝
      2026-04-07 09:14:24
      美國飛行員逃跑路線曝光,附近有山,耕地,城鎮,多山地形救了他

      美國飛行員逃跑路線曝光,附近有山,耕地,城鎮,多山地形救了他

      魔都姐姐雜談
      2026-04-06 17:02:35
      決戰要來了?特朗普威脅4小時摧毀所有電廠,伊朗開出10大要求

      決戰要來了?特朗普威脅4小時摧毀所有電廠,伊朗開出10大要求

      游古史
      2026-04-07 18:48:16
      全線大漲!剛剛,伊朗重磅發聲!

      全線大漲!剛剛,伊朗重磅發聲!

      新浪財經
      2026-04-06 20:39:04
      49年他婉拒了新中國外長職務:若不拒絕,恐怕開國元帥名單要改寫

      49年他婉拒了新中國外長職務:若不拒絕,恐怕開國元帥名單要改寫

      浩渺青史
      2026-03-25 13:59:19
      李世民在HK風評很差?為何教科書上全是負面評價?

      李世民在HK風評很差?為何教科書上全是負面評價?

      小豫講故事
      2026-03-31 06:00:03
      冷門牛股,歷史新高!鈉電池重大突破,徹底阻斷熱失控!業績報喜概念股出爐

      冷門牛股,歷史新高!鈉電池重大突破,徹底阻斷熱失控!業績報喜概念股出爐

      數據寶
      2026-04-07 12:08:52
      陳麗華公司曝離世內幕,對遲重瑞稱呼暴露關系,生前的話字字催淚

      陳麗華公司曝離世內幕,對遲重瑞稱呼暴露關系,生前的話字字催淚

      青梅侃史啊
      2026-04-07 19:50:05
      華國鋒指出13人不可特赦,主席:都放了,每人100元再請吃飯

      華國鋒指出13人不可特赦,主席:都放了,每人100元再請吃飯

      雍親王府
      2026-04-07 16:40:04
      39歲男子考研落榜后舉報復試第一考生,稱其在候考室違規翻閱資料,華東師大:正在調查

      39歲男子考研落榜后舉報復試第一考生,稱其在候考室違規翻閱資料,華東師大:正在調查

      極目新聞
      2026-04-07 14:00:56
      越南停電、印度癱瘓!全球客戶求中國復工:去中國化是個笑話?

      越南停電、印度癱瘓!全球客戶求中國復工:去中國化是個笑話?

      阿纂看事
      2026-04-07 17:35:18
      特朗普:4個小時可摧毀伊朗所有橋梁和發電廠,伊朗人民“想聽到炸彈的聲音”

      特朗普:4個小時可摧毀伊朗所有橋梁和發電廠,伊朗人民“想聽到炸彈的聲音”

      上觀新聞
      2026-04-07 08:58:18
      有沒有人敢爆自己的瓜?網友:確定玩這么大嗎?

      有沒有人敢爆自己的瓜?網友:確定玩這么大嗎?

      夜深愛雜談
      2026-02-18 20:55:58
      忠告天下子女:再孝順,也不要為年過75歲的老父老母,做這三件事

      忠告天下子女:再孝順,也不要為年過75歲的老父老母,做這三件事

      藝鑒在線
      2026-04-07 00:13:20
      中山市小欖鎮九洲基社區黨委書記盧常秋被查

      中山市小欖鎮九洲基社區黨委書記盧常秋被查

      南方都市報
      2026-04-07 13:04:06
      陳麗華立遺囑:兒女每人100億,余下歸唐僧老公!網友評論扎心了

      陳麗華立遺囑:兒女每人100億,余下歸唐僧老公!網友評論扎心了

      天光破云來
      2026-04-07 16:38:17
      一路走好!清明假期剛過完,已有4位名人離世,最大86歲 最小僅26

      一路走好!清明假期剛過完,已有4位名人離世,最大86歲 最小僅26

      潮鹿逐夢
      2026-04-07 12:33:18
      拓記:楊瀚森在G聯賽的打法,就是開拓者希望他在隊里扮演的角色

      拓記:楊瀚森在G聯賽的打法,就是開拓者希望他在隊里扮演的角色

      懂球帝
      2026-04-07 15:46:08
      當年的汗馬功臣,已成上不了臺面的炸雞,館長與鄭麗文的冷暖真相

      當年的汗馬功臣,已成上不了臺面的炸雞,館長與鄭麗文的冷暖真相

      拾這一抹殘妝月
      2026-04-02 22:05:10
      2026-04-07 20:27:00
      碼上閑敘
      碼上閑敘
      有態度網友ytd
      1317文章數 10關注度
      往期回顧 全部

      科技要聞

      滿嘴謊言!OpenAI奧特曼黑料大起底

      頭條要聞

      英媒:伊朗最高領袖病重昏迷 無法參與任何國家決策

      頭條要聞

      英媒:伊朗最高領袖病重昏迷 無法參與任何國家決策

      體育要聞

      官宣簽約“AI球員”,這支球隊被罵慘了...

      娛樂要聞

      女首富陳麗華離世 被曝生前已分好遺產

      財經要聞

      10萬億財政轉移支付,被誰拿走了?

      汽車要聞

      不止是大 極狐首款MPV問道V9靜態體驗

      態度原創

      手機
      游戲
      健康
      時尚
      軍事航空

      手機要聞

      華為暢享90 Pro Max升級鴻蒙6.0.0.138 SP23,新增HiCar互聯

      大話西游手游通用套裝哪個好用?仙族首選容止,變身卡不再被克

      干細胞抗衰4大誤區,90%的人都中招

      楊超越之后,全網頭像錦鯉的C位被她搶走了

      軍事要聞

      美軍營救飛行員出動155架飛機

      無障礙瀏覽 進入關懷版