This article explores how Go 1.20 and 1.21 introduced cause-tracking functions to the context package, solving the long-standing issue of vague context canceled errors by allowing developers to attach specific reasons to cancellations.
針對這項新特性,Hacker News 的社群討論呈現出兩極化的反應。支持者認為 Context 的取消與傳播機制是 Go 語言最強大的功能之一,甚至有開發者表示這是他熱愛使用 Go 編寫控制平面的主因。討論中也橫向對比了其他語言的實現,例如 C# 的 CancellationToken、Java 21 的結構化併發,以及 Kotlin 的協程機制。其中,Haskell 的非同步異常處理被譽為該領域的標竿,因為它能中斷任何純函數或 IO 操作,且不帶語法負擔,相較之下 Go 的實現顯得較為繁瑣。
然而,社群中也存在不少批評聲音,主要集中在 Go 語言日益增加的樣板代碼問題。部分開發者認為,為了獲取取消原因而必須手動傳遞 Context 並撰寫大量錯誤處理邏輯,是一種對語言設計缺陷的妥協。有留言指出,這反映了 Go 團隊在追求簡單性時,將解決問題的負擔轉嫁給了開發者,導致開發者必須像「對抗語言」一樣工作。甚至有觀點建議,Context 與錯誤處理應該像隱含變數一樣由編譯器處理,而非強迫開發者在每個函數簽名中顯式宣告。
此外,關於錯誤處理的哲學爭論也隨之展開。一些開發者堅信顯式的錯誤處理優於傳統的異常機制,認為這能讓代碼流向更易於追蹤;但反對者則認為,當 99% 的錯誤處理只是簡單地包裹並回傳時,這種顯式性就變成了無意義的雜訊。對於本次新增的 Cause API,雖然解決了生產環境中難以調試的問題,但其與 defer cancel() 互動時可能導致原因遺失的細節,也被視為另一種容易踩坑的設計陷阱。