首页 > 解决方案 > 如何在 Go 中连接两个数组

问题描述

我正在努力寻找答案的一个基本问题,因为有很多关于如何使用 append 函数和错误使用单词“array”的扩展运算符连接两个切片的答案。

我是 Go 新手,并假设使用大小数组是已知大小的好习惯。但是,我正在努力使用数组,因为我不知道如何进行简单的操作,例如连接。这是一些代码。

var seven [7]int

five := [5]int{1,2,3,4,5}
two := [2]int{6,7}

//this doesn't work as both the inputs and assignment are the wrong type
seven = append(five,two)

//this doesn't work as the assignment is still the wrong type
seven = append(five[:],two[:])

//this works but I'm not using arrays anymore so may as well use slices everywhere and forget sizing
seven2 := append(five[:],two[:])

据我所知,我可以放弃数组并专门使用切片,也可以编写一个循环来显式构造新数组。有第三种选择吗?

标签: arraysgoslice

解决方案


append()只能用于将元素附加到切片。如果您有一个数组,则不能将其直接传递给append().

您可以做的是对数组进行切片,因此您会得到一个切片(它将使用数组作为其后备存储),并且您可以使用该切片作为元素的目标和源。

例如:

s := seven[:0]
s = append(s, five[:]...)
s = append(s, two[:]...)
fmt.Println(seven)

这将打印(在Go Playground上尝试):

[1 2 3 4 5 6 7]

另请注意,由于append()返回结果切片,因此可以将所有这些写在一行中:

_ = append(append(seven[:0], five[:]...), two[:]...)

(这里不需要存储结果,因为我们有并且只想使用后备数组,但通常情况并非如此。)

这输出相同,请在Go Playground上尝试。虽然这不是很可读,所以不值得将它压缩成一行。

尽管当您拥有目标数组时,“附加”数组只不过是将它们复制到目标,复制到正确的位置。为此,您也可以使用内置copy()函数。请注意,该copy()函数也只接受切片,因此您也必须在此处对数组进行切片。

copy(seven[:], five[:])
copy(seven[len(five):], two[:])
fmt.Println(seven)

这将输出相同的内容。在Go Playground上试试这个。


推荐阅读