考慮實驗切片包中的兩個函數: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)的類型參數。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3