1 回答
TA贡献2080条经验 获得超4个赞
如果您必须返回与参数相同(可能命名)类型的切片,这很重要。
如果您不必返回切片(仅返回一些其他信息,例如 abool以报告是否包含该值),则无需使用本身约束切片的类型参数,您可以为元素使用类型参数只要。
如果必须返回与输入相同类型的切片,则必须使用本身约束到切片的类型参数(例如~[]E)。
为了演示,让我们看看这两个实现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)]
}
如果您传递具有切片作为其基础类型的自定义类型的切片,Grow()则可以返回相同类型的值。Grow2()不能:它只能返回一个未命名的切片类型的值:[]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),接收一个 type 的值main.ints,但它返回一个 type 的值[]int。这不是我们想要的。
- 1 回答
- 0 关注
- 73 浏览
添加回答
举报