通用切片參數與切片類型約束
在Go 的實驗性切片包中,兩個函數Contains 和Grow 接受不同類型的參數限制。 Contains 採用通用 []E 類型,而 Grow 將其參數類型限制為切片 (~[]E)。
型別約束
型別約束,以 ~ 表示,確保型別符合特定的介面或規則集。在 Grow 中,~[]E 約束強制參數類型最終必須是元素類型為 E 的切片。
等效功能?
儘管類型約束不同,兩個函數中可用的操作看起來幾乎相同。然而,當函數必須傳回與輸入參數相同類型的切片時,就會出現一個關鍵的實際差異。
返回切片
當返回相同類型的切片時作為輸入,使用像 ~[]E 這樣的類型約束至關重要。這允許函數保留輸入切片的命名類型。
考慮Grow() 的兩個版本:
// Preserves named type func Grow[S ~[]E, E any](s S, n int) S {...} // Returns unnamed type func Grow2[E any](s []E, n int) []E {...}
如果Grow() 接收自訂切片類型,它可以傳回相同類型的切片,而Grow2() 將始終傳回未命名的切片。
示範
type MyInts []int x := MyInts{1} // Custom slice type x2 := Grow(x, 10) // Type preserved x3 := Grow2(x, 10) // Unnamed type
在此範例中,x2 將是輸入 MyInts,而 x3 將是一個未命名的切片。
結論
當您需要在回傳值中保留輸入切片的命名類型時,這是必要的使用類似 ~[]E 的類型約束。否則,傳回的切片將始終是未命名類型。
以上是從函數傳回切片時,切片約束如何影響類型保留?的詳細內容。更多資訊請關注PHP中文網其他相關文章!