泛型切片參數:理解區別
在Go 中,泛型編程引入了類型參數,允許函數對不同類型進行操作。感興趣的一個領域是限制為切片類型的切片參數和通用切片參數之間的區別。
限制為切片類型的切片參數
考慮使用 slices.Grow 函數第一個參數受 ~[]E 約束。這意味著該參數的類型必須是元素類型為 E 的切片類型。
通用切片參數
相反,考慮 slices.Contains 函數第一個參數簡單地輸入為 []E。這允許任何元素類型為 E 的切片類型。
實際差異
最初,這兩種類型的切片參數的行為似乎相似,因為它們兩者都允許函數存取切片操作,例如追加和範圍。然而,在返回切片時,有一個微妙但重要的區別。
返回切片
如果函數需要傳回與以下類型相同類型的切片輸入切片,您必須使用限制為切片類型的切片參數(~[]E) 。這確保返回的切片具有正確的基礎類型。
範例
讓我們比較兩個Grow() 實作:一個使用~[]E,另一個使用[ ]E.
func Grow[S ~[]E, E any](s S, n int) S {
// ...
}
func Grow2[E any](s []E, n int) []E {
// ...
}
如果我們傳遞自訂類型的切片(例如,[]MyInt),Grow() 可以傳回相同類型的值。然而,Grow2()只能傳回通用切片類型([]E)。
結論
綜上所述,如果需要返回相同的切片type 作為輸入切片,您必須使用限制為切片類型的切片參數(~[]E )。否則,使用通用切片參數就足夠了。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3