Go 1.18 如何實現泛型?

2022-03-03 09:00:13

Go 在 1.18 版本中了他們如何通過字典 (dictionaries)GC Shape Stenciling 在 Go 1.18 中實現泛型。

泛型的編譯器實現(在型別檢查之後)主要側重於建立泛型函數和方法的範例,這些範例將與具有具體型別的引數一起執行。為了避免針對泛型函數/方法的每一次呼叫建立不同的函數範例,並帶有不同型別的引數(這種是純粹的 stenciling 方案)。因此 Go 泛型在每次呼叫泛型函數/方法時都會傳遞一個字典。該字典提供了關於型別引數的相關資訊,允許單個函數範例對許多不同的型別引數正確執行。

但是,為了泛型的簡潔(和效能),團隊沒有針對所有可能的型別引數進行單一的通用函數/方法編譯。相反,他們在具有相同 gcshape 的型別引數集之間共用通用函數/方法的範例化。

gcshape (or gcshape grouping) 是型別的集合,當被指定為型別引數之一時,這些型別可以在泛型的實現中共用通用函數/方法的相同範例。

例如,在具有單一型別引數的泛型函數的場景中,只需要為同一 gcshape grouping 中的所有型別引數提供一個函數範例。同樣的,對於具有單一型別引數的泛型型別的方法,只需要對同一 gcshape grouping 中的所有型別引數(泛型型別)進行一次範例化。gcshape 型別是團隊實現泛型過程中使用的特定型別,他們使用這樣的範例化來填充 gcshape grouping 中的所有型別。

展開閱讀全文