Go 部落格
為 Go 新增泛型的建議
泛型提案
我們已提交 Go 語言變更提案,以新增對類型和函式的類型參數支援,允許的一般型態的程式設計。
為何需要泛型?
泛型可提供強大的建構區塊,讓我們能更容易地共用程式碼和建置程式。泛型程式設計是指撰寫讓部分類型留待在稍後指定的函式和資料結構。例如,您可以撰寫一個對任意資料類型切片的運算函式,其中實際的資料類型只會在呼叫函式時才指定。或者,您可以定義一個儲存任何類型的值的資料結構,其中實際要儲存的類型會在建立資料結構實例時指定。
自 Go 於 2009 年首次釋出以來,支援泛型一直是最常要求的語言功能之一。您可以在 較早一篇部落格文章 中瞭解泛型的用途。
儘管泛型有明確的使用案例,但要整齊地把它們納入 Go 這類語言中仍然是一項艱鉅的任務。最初 (有缺失的) 試圖為 Go 新增泛型的 嘗試中之一,最早可追溯至 2010 年。在過去的十年中,還有其他幾次嘗試。
過去幾年,我們一直從事一系列設計草案,並以基於型別參數的設計為最終目標。這個設計草案已獲得 Go 編程社群大量意見回饋,許多人使用泛型 Playground(在先前部落格文章中說明)進行實驗。Ian Lance Taylor 在 2019 年 GopherCon 中發表演說,說明為什麼應該加入泛型以及我們目前採用的策略。Robert Griesemer 在 2020 年 GopherCon 中發表後續演說,說明設計與實作的變更。語言變更完全向後相容,因此現有的 Go 程式會完全比照現今的方式運作。我們已經達到認為設計草案已經夠好、夠簡單的程度,可以提議將其加入 Go。
現在會發生什麼事?
語言變更建議流程是我們變更 Go 語言的方式。我們現在已開始這個流程,將泛型加入未來的 Go 版本中。我們歡迎實質性的批評與意見,但請盡量不要重複早期的意見,而且請避免使用簡單的加一和減一意見。請針對您同意或不同意的意見,或針對整體建議,加上按讚/按噓的 emoji 反應符號。
與所有語言變更建議一樣,我們的目標是朝著一個結論前進,也就是將泛型納入語言中,或讓建議作廢。我們了解,對於這種規模的變更,不可能讓 Go 社群的每個人都滿意,但我們打算做出一個大家都願意接受的決定。
如果建議獲得接受,我們希望能有一個完整的、雖然可能不是完全最佳化的實作,供使用者在本年度結束前試用,或許會作為 Go 1.18 beta 版本的一部分。
後續文章:Go 中的指令碼路徑安全性
前一篇文章:深入探討 ARM 及其他精彩內容
部落格索引