首頁  >  文章  >  後端開發  >  Go 中何時使用 ~[]E 與 []E 作為切片參數?

Go 中何時使用 ~[]E 與 []E 作為切片參數?

DDD
DDD原創
2024-10-24 04:23:02689瀏覽

When to Use ~[]E vs []E for Slice Arguments in Go?

探索通用切片參數的微妙之處

考慮實驗切片包中的兩個函數:Contains 和 Grow。兩個函數都接受切片參數,但具有不同的類型約束:

類型約束

Contains 的第一個參數具有類型[]E,其中E 受可比較約束,表明E必須可比較。另一方面,Grow 的第一個參數具有類型 S,受 ~[]E 約束,表明 S 必須具有作為 E 切片的基礎類型。

實際意義

乍一看,使用這兩種類型約束似乎沒有實際區別。但是,當您需要傳回與 Grow 中的參數相同類型的切片時,情況並非如此。

切片約束類型參數的意義

如果您需要傳回與輸入參數類型相同的切片,您必須使用本身約束為切片的類型參數(例如,~[]E)。這允許函數傳回與參數相同類型的值。

Grow 示範

讓我們考慮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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn