Go官方已經開始著手Go 2的開發程序,並啟動設計草稿發想,率先丟出了三個討論提案,分別是錯誤處理(Error Handling)、錯誤值語意(Error Values)以及泛型(Generics),官方強調,這些提案還只是草稿設計,並非正式官方提案,歡迎Go使用者參與討論改進。

這些草案設計並非Go提案流程意義上的正式提案,而是作為拋磚引玉,給社群一個討論的起點,最終目標是產生夠好的設計,以轉化成實際的正式提案。官方提到,每個草案設計應該都要附有問題概述,來幫助社群理解設計背景,並且提供足夠的設計細節,幫助建構和指引有關的討論。官方列出的泛型、錯誤值語意以及錯誤處理三個設計草案作為示範,希望所有Go用戶都能幫忙改進,並轉成最終的提案。

Go團隊提到,Go 2的整體目標是要解決Go無法擴展使用在大型程式碼基底,與大型開發人員工作的問題,而他們在Go首次開源前,就一直討論泛型的可能。在參考C++和Java的經驗後,他們發現這主題需要一段時間理解,才能設計出良好的解決方案,在社群中有人錯誤認為,Go團隊的立場永遠不會有泛型,官方提到,相反的,因為他們理解雖然泛型會為Go帶來更多靈活性,但同時也會讓Go變得複雜許多。

現在Go團隊提出設計草案,建議擴展Go語言,為類別和函數增加可選的類別參數。目標是要讓開發者在撰寫Go函式庫的時候,這些函式庫抽象不需要類別細節,特別是除了預期中的容器類別之外,Go團隊也希望可以編寫有用的函式庫,來操作任意的map和channel值,最理想的狀態是可撰寫執行在 []byte和string上的多型函數。

同時設計草稿也提到,其他類別的參數化不在目標中,像是透過常量進行的參數化,另外,以位元包裝定義通用向量<T>和特殊案例向量<bool>,這類實作多型定義的特化實現也並非目標。

致力於讓Go邁向大型程式碼應用,除了程式必須輕量、不過度重複並且強健外,在出現錯誤時還要能優雅地處理錯誤。Go團隊希望Go的錯誤檢查可以更加輕量化,減少專用於錯誤檢查的Go程式文字,此外,也朝更方便撰寫錯誤處理程式碼的方向前進,進而提升開發者執行這項工作的意願。而且錯誤檢查和錯誤處理的工作都必須外顯,也就是說在程式文字必須可見,Go團隊認為,他們不想重蹈覆轍異常處理的陷阱。在進行錯誤處理改進工作,必須讓現有的所有程式都適用。

Go團隊在設計草案中,為此引入兩種新的語法形式,首先使用檢查表示式檢查f(x, y, z)和錯誤,並標記出顯性錯誤,其次加入定義錯誤處理程式的處理語句,當錯誤檢查失敗時,會將控制權轉移到內層處理程式,該處理程式會將控制權再轉移到下一個處理程式,以此類推直到處理程式執行return語句。

錯誤處理可以檢查並且回應錯誤之外,良好的報告錯誤也是非常重要的工作。由於錯誤值是實作錯誤介面的任何值,Go程式會以4種方式測試特定錯誤。無論哪種方式,當原始錯誤是已知的標記或已知的錯誤實作類別,則無論是透過fmt.Errorf,抑或是WriteError這類新類別,都會破壞相等性檢查並鍵入斷言以查詢原始錯誤。而這將阻止包裝,使得有用的錯誤減少。

在複雜的程式中,最有用的錯誤敘述,必須包括導致錯誤的所有不同操作的訊息。而錯誤值語意設計草稿解決了兩個問題,錯誤檢閱和錯誤格式化,分別會由不同的草案解決,同樣會在維持與現有程式碼互通的情況下,允許套件繼續定義自己的錯誤類別,以指向錯誤實作能夠滿足的定義可選介面方向。

Go團隊希望所有使用者可以幫忙改進草案,使其可以轉為正式的Go提案,官方建立了一個維基頁面,以收集和組織每個主題的回饋。


Advertisement

更多 iThome相關內容