泛型切片參數:理解區別
在Go 中,泛型程式引入了類型參數,允許函數對不同類型進行操作。感興趣的一個領域是限制為切片類型的切片參數和通用切片參數之間的區別。
限制為切片類型的切片參數
考慮使用 slices.Grow 函數第一個參數受 ~[]E 約束。這意味著該參數的類型必須是元素類型為 E 的切片類型。
通用切片參數
相反,考慮 slices.Contains 函數第一個參數簡單地輸入為 []E。這允許任何元素類型為 E 的切片類型。
實際差異
最初,這兩種類型的切片參數的行為似乎相似,因為它們兩者都允許函數存取切片操作,例如追加和範圍。然而,在返回切片時,有一個微妙但重要的區別。
返回切片
如果函數需要傳回與以下類型相同類型的切片輸入切片,您必須使用限制為切片類型的切片參數(~[]E) 。這可以確保傳回的切片具有正確的基礎類型。
範例
讓我們比較兩個Grow() 實作:一個使用~[]E,另一個使用[ ]E.
<code class="go">func Grow[S ~[]E, E any](s S, n int) S { // ... } func Grow2[E any](s []E, n int) []E { // ... }</code>
如果我們傳遞自訂類型的切片(例如[]MyInt),Grow() 可以傳回相同類型的值。然而,Grow2() 只能傳回通用切片類型([]E)。
結論
綜上所述,如果需要返回相同的切片type 作為輸入切片,您必須使用限制為切片類型的切片參數(~[]E )。否則,使用通用切片參數就足夠了。
以上是在 Go 中何時使用限制為切片類型的切片參數與通用切片參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!