为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中初始化数组时使用 spread

Go 中初始化数组时使用 spread

Go
慕村225694 2023-07-26 16:30:58
我有一个重复的值列表,我想在初始化多个数组时重复使用这些值:package mainimport (    "fmt")func main() {    var i = []int{1, 2, 3}    var a = []int{2, i..., 3}    fmt.Println(a)}上面的代码给出了以下错误:./prog.go:9:20: 语法错误:意外...,需要逗号或 }我想使用扩展...运算符,但这在初始化数组时似乎不可能。我在这里遗漏了什么或者不允许传播吗?
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您只能...在将切片传递给可变参数函数时使用它。

例如,您可以在将其传递给时使用它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))),则不能将其与复合文字结合起来来列出元素。


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信