1 回答

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果您必須返回與參數(shù)相同(可能命名)類型的切片,這很重要。
如果您不必返回切片(僅返回一些其他信息,例如 abool以報(bào)告是否包含該值),則無需使用本身約束切片的類型參數(shù),您可以為元素使用類型參數(shù)只要。
如果必須返回與輸入相同類型的切片,則必須使用本身約束到切片的類型參數(shù)(例如~[]E)。
為了演示,讓我們看看這兩個(gè)實(shí)現(xiàn)Grow():
func Grow[S ~[]E, E any](s S, n int) S {
return append(s, make(S, n)...)[:len(s)]
}
func Grow2[E any](s []E, n int) []E {
return append(s, make([]E, n)...)[:len(s)]
}
如果您傳遞具有切片作為其基礎(chǔ)類型的自定義類型的切片,Grow()則可以返回相同類型的值。Grow2()不能:它只能返回一個(gè)未命名的切片類型的值:[]E。
和演示:
x := []int{1}
x2 := Grow(x, 10)
fmt.Printf("x2 %T len=%d cap=%d\n", x2, len(x2), cap(x2))
x3 := Grow2(x, 10)
fmt.Printf("x3 %T len=%d cap=%d\n", x3, len(x3), cap(x3))
type ints []int
y := ints{1}
y2 := Grow(y, 10)
fmt.Printf("y2 %T len=%d cap=%d\n", y2, len(y2), cap(y2))
y3 := Grow2(y, 10)
fmt.Printf("y3 %T len=%d cap=%d\n", y3, len(y3), cap(y3))
輸出(在Go Playground上試試):
x2 []int len=1 cap=12
x3 []int len=1 cap=12
y2 main.ints len=1 cap=12
y3 []int len=1 cap=12
如您所見Grow2(y, 10),接收一個(gè) type 的值main.ints,但它返回一個(gè) type 的值[]int。這不是我們想要的。
- 1 回答
- 0 關(guān)注
- 86 瀏覽
添加回答
舉報(bào)