go - 附加到新切片影响原始切片
问题描述
我有以下代码会导致奇怪的结果。我不明白为什么:
func main() {
var s = []int{2, 3}
var s1 = append(s, 4)
var a = append(s1, 5)
var b = append(s1, 6)
fmt.Println(s)
fmt.Println(s1)
fmt.Println(a)
fmt.Println(b)
}
这将导致:
[2 3]
[2 3 4]
[2 3 4 6]
[2 3 4 6]
我的问题是:为什么 a 不是 [2 3 4 5] 而是 [2 3 4 6]?我知道追加到 b 更改 a,但是如何。这是一个错误,因为我从未直接更改 a 并且显然我不希望这种情况发生吗?
解决方案
请记住,切片是 3 个字段的结构。
- 指向底层数组的指针
- 切片的长度
- 切片容量
append() 函数可以就地修改其参数或返回其参数的副本以及附加条目,具体取决于其输入的大小和容量。append() 函数创建一个新的切片,如果切片的长度大于切片指向的数组的长度。
推荐阅读
- c# - C# ASP.NET Core AutoMapper:子对象为空
- c# - C# - 如何从给定月份获取天数以及前/后天数以填充列表
- go - 如何将任何结构作为参数发送给方法并返回结构?
- machine-learning - 如何处理标签计数差异很大的二进制分类
- c# - 使用 Visual Studio SDK,我将如何折叠一段代码?
- r - R中许多数据的平均计算
- php - PHP:如何从多维数组制作并行数组
- javascript - 从 Express JS 服务器发送数据以更新我当前 HTML 表单中的文本?
- android - Android - 从通知重定向主要活动中的片段
- python - ValueError:“日期”需要是 str