Go 泛型主要設(shè)計(jì)者介紹使用泛型的最佳時(shí)機(jī)
近期一篇主題為“Go 泛型導(dǎo)致代碼運(yùn)行速度變慢”的文章引起了廣泛討論。因?yàn)?Go 開發(fā)者對(duì)“泛型”這項(xiàng)特性期盼已久,但最后卻發(fā)現(xiàn)有所落差。
Go 泛型主要設(shè)計(jì)者 Ian Lance Taylor 也留意到了相關(guān)的討論,于是近日他在 Go 官方博客發(fā)表了自己 2021 年的演講——《When To Use Generics》,來介紹使用 Go 泛型的最佳時(shí)機(jī)。

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















 
 
 







 
 
 
 