arrays - 如何在 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[:])
据我所知,我可以放弃数组并专门使用切片,也可以编写一个循环来显式构造新数组。有第三种选择吗?
解决方案
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上试试这个。
推荐阅读
- javascript - 你能用 Hooks 添加一个组件来声明状态吗?
- java - javafx 的 Swing 中是否有 ComboBoxModel 的等价物?
- azure-devops - 在 Azure DevOps sprint 项目中 - 有没有一种方法可以与团队共享评论,而无需客户看到?
- python-3.x - 当字典内容附加到列表并且字典在每次迭代中被清除时,为什么字典列表是空的?
- laravel - 在 Laravel 中动态注册命令
- batch-file - 将网站内容复制到变量的批处理脚本
- ms-word - 目录格式问题,Microsoft Word
- unix - 如何列出另一个目录的内容而不在其中?
- r - 删除具有少于 9 个唯一观察值的 ID
- java - 使用 import static org.junit.jupiter.api.Assertions.* 时,“assertEquals(boolean, Boolean) 类型不明确”;