欢迎光临
我们一直在努力

Go語言公佈 2.0設計草案:主打規模化和擴展性,支持泛型

去年7月,Go語言官博就曾透露 Go 2 開發計畫,並表示 Go 2 的目標就是解決 Go 1.x 在規模化方面做的還不夠好的地方。隨著時間的推進,開發團隊已著手準備 2.0 版本的開發工作,並公佈了設計草案,供社區討論和反饋,以促進最終的語言設計。

設計草案包含三個方面,錯誤處理、錯誤值和泛型,並針對各個方面進行了詳細的概述和改進草案。大致總結如下:

一、錯誤處理(Error handling)

為擴展至大型代碼庫,Go 程序必須是輕量級的,不會過度重複,且具備穩健性,能夠優雅地處理出現的錯誤。

目前 Go 檢查錯誤的代碼太多,但處理這些錯誤的代碼卻嚴重不足。對於 Go 2,團隊希望錯誤檢查更加輕量級,減少用於錯誤檢查的 Go 程序的文本量。此外,還能更加方便地編寫錯誤處理程序,提高開發者處理錯誤的可能性。

為避免處理重複異常,錯誤檢查和錯誤處理還必須是顯性的,在程序文本中可見。

參考示例:

func main() {	hex, err := ioutil.ReadAll(os.Stdin)	if err != nil {		log.Fatal(err)	}	data, err := parseHexdump(string(hex))	if err != nil {		log.Fatal(err)	}	os.Stdout.Write(data)}

簡化後:

func main() {	handle err {		log.Fatal(err)	}	hex := check ioutil.ReadAll(os.Stdin)	data := check parseHexdump(string(hex))	os.Stdout.Write(data)}

二、錯誤值(Error values)

大型程序必須能夠以編程方式測試和響應錯誤,並且還能很好地報告它們。

目前的各種流行的助手工具包添加了超出標準錯誤接口的功能,但它們以不兼容的方式執行。對於 Go 2,開發團隊考慮將“可選接口”標準化,以允許這些工具包進行互操作,並慢慢減少對它們的需求。

改進主要包含兩個目標:一是讓程序的錯誤檢查更容易,更不容易出錯,以提高程序的錯誤處理和穩健性;二是希望能夠以標準格式打印包含額外細節的錯誤。

// Is reports whether err or any of the errors in its chain is equal to target.func Is(err, target error) bool// As checks whether err or any of the errors in its chain is a value of type E.// If so, it returns the discovered value of type E, with ok set to true.// If not, it returns the zero value of type E, with ok set to false.func As(type E)(err error) (e E, ok bool)

三、泛型(Generics)

想要擴展到大型代碼庫,代碼的可重用性非常重要。

Go 團隊在早期其實一直有在調查和討論“泛型”的可能性設計,但由於種種原因,Go 1 更多的是確保能快速構建包含很多獨立軟件包的程序。

Go 2 的目標是通過允許帶有類型參數的參數多態來解決編寫 Go 庫的問題,這些問題抽象出了不必要的類型細節。

此外,除了預期的容器類型之外,開發團隊還希望能編寫有用的庫來操作任意的 map 和 channel 值。理想方案是編寫能夠同時操作 [ ]byte 和 string 值的多態函數。

type List(type T) []Tfunc Keys(type K, V)(m map[K]V) []K

來源:

https://go.googlesource.com/proposal/+/master/design/go2draft.md

https://hackernoon.com/5-reasons-why-we-switched-from-python-to-go-4414d5f42690

赞(0)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

JPHub

聯系我們聯系我們