考慮實驗切片包中的兩個函數:Contains 和 Grow。兩個函數都接受切片參數,但具有不同的類型約束:
Contains 的第一個參數具有類型[]E,其中E 受可比較約束,表明E必須可比較。另一方面,Grow 的第一個參數具有類型 S,受 ~[]E 約束,表明 S 必須具有作為 E 切片的基礎類型。
乍一看,使用這兩種類型約束似乎沒有實際區別。但是,當您需要傳回與 Grow 中的參數相同類型的切片時,情況並非如此。
如果您需要傳回與輸入參數類型相同的切片,您必須使用本身約束為切片的類型參數(例如,~[]E)。這允許函數傳回與參數相同類型的值。
讓我們考慮Grow 的兩種實作:
func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E
當傳遞時以切片作為其基礎類型的自訂類型的切片,Grow 可以傳回相同類型的值,而Grow2 則不能。 Grow2 只能傳回未命名切片類型的值,[]E。
type ints []int // user-defined slice type ints x := []int{1} // initialize a slice x of type []int x2 := Grow(x, 10) // x2 will be of type []int y := ints{1} // initialize a slice y of type ints y2 := Grow(y, 10) // y2 will be of type ints
這裡,Grow2(y, 10) 接收一個 ints 類型的值,但傳回一個值[]int 類型,這不是預期的行為。
總之,當函數呼叫需要傳回與參數相同(可能命名)類型的切片時,使用本身限制為切片 (~[]E) 的型別參數是必要的。否則,可以使用僅約束元素類型(E any)的類型參數。
以上是Go 中何時使用 ~[]E 與 []E 作為切片參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!