底層使用Go應用程式的知名無伺服器資料庫平臺Planetscale,在Go 1.18剛發布不久,其工程師便針對新的泛型功能進行測試,並在自家部落格發表文章提到,Go的泛型功能可能使程式碼變慢,而該篇文章在網路被熱烈討論,因為Go開發者盼望了泛型功能許久,最後拿到的卻與期待有所落差。
而Google技術總監同時也是Go泛型主要設計者的Ian Lance Taylor,則在Go部落格搬出2021年,他在Go Day與GopherCon的講題When To Use Generics,來說明Go泛型的正確使用時機。
Planetscale的工程師提到,之所以Go泛型可能使程式碼變慢的原因,是因為Go泛型的實作,並非使用完全單態化(Monomorphization),而是採用了一種稱為GCShape Stenciling with Dictionaries的部分單態化技術,該方法雖然可大幅減少程式碼的量,但是卻會在特定的情況下,使程式碼變慢。
而Ian Lance Taylor提到,Go的程式開發通用準則,要開發者透過編寫程式碼來撰寫Go程式,而非定義類型,因此談到泛型,要是開發者透過定義類型參數約束來撰寫程式,那一開始就走錯路了,應該從編寫函式開始,而在之後就能夠自然地添加類型參數,因為類型參數在該情況展現的好處將會非常明顯。
Ian Lance Taylor列出4個類型參數可能有用的情況,第一是使用語言定義的特殊容器類型,進行操作的函式,像是slice、map和channel,當函式具有這些類型的參數,並且函式程式碼沒有對元素類型進行任何特定假設,則類型參數可能有用。
另一個參數類型有用的情況,是用於通用資料結構,像是鏈結串列(Linked List)或是二元樹(Binary Tree),這些類似slice或map但又非語言內建的通用資料結構。第三則是類型參數首選函式而非方法,開發者可以將方法轉換成函式,會比將方法添加到類型中簡單的多。最後一個類型參數可發揮效果的情況,是不同類型需要實現通用方法,且不同類型的實作看起來都相同時。
Ian Lance Taylor也提醒了不適合使用類型參數的時機,包括不要用類型參數代替介面類型(Interface Type),且當方法實作不同時,也不要使用類型參數。他提到,Go 1.18實作泛型的方法,使得類型參數通常不會比介面類型快,因此不需要為了執行速度更改程式碼。
Ian Lance Taylor最後給出了簡單的泛型使用方針,就是當開發者發現自己多次編寫相同的程式碼,而副本不同之處的唯一區別,僅在於使用了不同類型,便可以考慮使用類型參數。
熱門新聞
2024-12-22
2024-12-20
2024-12-22
2024-12-20