我有一个重复的值列表,我想在初始化几个这样的数组时重新使用它们:
package main
import (
"fmt"
)
func main() {
var i = []int{1, 2, 3}
var a = []int{2, i..., 3}
fmt.Println(a)
}
Run Code Online (Sandbox Code Playgroud)
上面的这段代码给出了以下错误:
./prog.go:9:20: 语法错误:意外...,需要逗号或}
我想使用扩展...运算符,但是在初始化数组时这似乎是不可能的。
我在这里遗漏了什么或不允许传播吗?
...将切片传递给可变参数函数时,您只能使用切片。请参阅规范:将参数传递给 ... 参数。
因此,例如,您可以在将其传递给时使用它append():
var i = []int{1, 2, 3}
a := append([]int{2}, i...)
a = append(a, 3)
fmt.Println(a)
Run Code Online (Sandbox Code Playgroud)
哪些输出(在Go Playground上试试):
[2 1 2 3 3]
Run Code Online (Sandbox Code Playgroud)
或者,上述内容可以写成一行:
a := append(append([]int{2}, i...), 3)
Run Code Online (Sandbox Code Playgroud)
请注意,这可能很紧凑,但不一定有效,因为它可能会在后台创建和复制多个支持数组。
为确保单一分配,您可以使用make()提供的容量,例如:
a := make([]int, 0, 2+len(i))
a = append(a, 2)
a = append(a, i...)
a = append(a, 3)
Run Code Online (Sandbox Code Playgroud)
在Go Playground上试试这个。
另一个解决方案是,copy()如果您预先分配了切片(make()在复合文字中使用或使用索引):
a := []int{2, 4: 3}
copy(a[1:], i)
Run Code Online (Sandbox Code Playgroud)
在Go Playground上试试这个。这里的缺点是索引 ( 4: 3) 必须是常量,不能像1 + len(i). 如果您想预先分配切片(例如make([]int, 2+len(i))),则不能将其与复合文字组合以列出元素。