Go 泛型主要設(shè)計者介紹使用泛型的最佳時機
近期一篇主題為“Go 泛型導致代碼運行速度變慢”的文章引起了廣泛討論。因為 Go 開發(fā)者對“泛型”這項特性期盼已久,但最后卻發(fā)現(xiàn)有所落差。
Go 泛型主要設(shè)計者 Ian Lance Taylor 也留意到了相關(guān)的討論,于是近日他在 Go 官方博客發(fā)表了自己 2021 年的演講——《When To Use Generics》,來介紹使用 Go 泛型的最佳時機。
上文提到的文章指出,從歷史上看,C++、D 乃至 Rust 等系統(tǒng)語言一直采用單態(tài)化方法實現(xiàn)泛型。然而,Go 1.18 的泛型實現(xiàn)并不完全依靠單態(tài)化 (Monomorphization),而是采用了一種被稱為"GCShape stenciling with Dictionaries"的部分單態(tài)化技術(shù)。這種方法的好處是可以大幅減少代碼量,但在特定情況下,會導致代碼速度變慢。
Ian Lance Taylor 表示,Go 的通用開發(fā)準則有要求:開發(fā)者應(yīng)通過編寫代碼而不是定義類型來編寫 Go 程序。當涉及到泛型時,如果通過定義類型參數(shù)約束來編寫程序,那一開始就走錯了路。正解應(yīng)該是從編寫函數(shù)開始,當明確了類型參數(shù)的作用后,再添加類型參數(shù)就很容易了。
接著,Ian 列舉了 4 種類型參數(shù)能有效發(fā)揮作用的情況:
- 使用語言定義的特殊容器類型
- 通用數(shù)據(jù)結(jié)構(gòu)
- 類型參數(shù)首選是函數(shù),而非方法的情況
- 不同類型需要實現(xiàn)通用方法
同時也提醒了不適合使用類型參數(shù)的情況:
- 不要使用類型參數(shù)替換接口類型 (Interface Type)
- 如果方法實現(xiàn)不同,不要使用類型參數(shù)
- 在適當?shù)牡胤绞褂梅瓷?(reflection)
最后,Ian 給出了簡要的泛型使用方針,當開發(fā)者發(fā)現(xiàn)自己多次編寫完全相同的代碼,而這些副本之間的唯一區(qū)別僅在于使用了不同類型,這時候便可以考慮使用類型參數(shù)。換句話說,即開發(fā)者應(yīng)避免使用類型參數(shù),直到發(fā)現(xiàn)自己要多次編寫完全相同的代碼。
本文轉(zhuǎn)自O(shè)SCHINA
本文標題:Go 泛型主要設(shè)計者介紹使用泛型的最佳時機
本文地址:https://www.oschina.net/news/191309/when-generics