在将切片传递给可变参数函数时,您只能将 ... 与切片一起使用。见Spec: Passing arguments to ... parameters。
因此,例如,您可以在将其传递给 append() 时使用它:
var i = []int{1, 2, 3}
a := append([]int{2}, i...)
a = append(a, 3)
fmt.Println(a)
哪些输出(在Go Playground 上试试):
[2 1 2 3 3]
或者上面可以写成一行:
a := append(append([]int{2}, i...), 3)
请注意,这可能很紧凑,但不一定高效,因为它可能会在后台创建和复制多个支持数组。
为确保单一分配,您可以使用make() 并提供容量,例如:
a := make([]int, 0, 2+len(i))
a = append(a, 2)
a = append(a, i...)
a = append(a, 3)
在Go Playground 上试试这个。
另一个解决方案是使用copy(),如果您预先分配了切片(使用make() 或在复合文字中使用索引):
a := []int{2, 4: 3}
copy(a[1:], i)
在Go Playground 上试试这个。这里的缺点是索引 (4: 3) 必须是常数,不能像1 + len(i) 这样。如果您想预先分配切片(例如make([]int, 2+len(i))),则不能将其与复合文字结合起来列出元素。