跳转到主内容
极星编程网:以代码为星,赴技术山海!

Go语言切片append操作:为什么修改一个切片会影响另一个?

go语言 切片
append
操作详解:共享底层数组引发的疑惑 本文深入探讨Go语言切片(slice)的底层机制,重点解释
append
函数在切片容量未满时,修改一个切片会影响另一个切片的原因。 我们先来看一段代码:
a := make([]int, 0, 3) b := append(a, 1) _ = append(a, 2) fmt.Println(b[0]) // 输出 2
代码中,我们创建了一个容量为3,长度为0的整数切片
a
。然后,将
append(a, 1)
的结果赋值给
b
。此时,
a
为空,
b
为
[1]
,这很好理解。 关键在于第二行
_ = append(a, 2)
。为什么对
a
进行
append
操作后,
b[0]
的值变成了2呢? 立即学习 “ go语言免费学习笔记(深入) ”; go语言参考手册 中文CHM版 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译 下载 原因在于Go语言切片的底层实现:当切片的容量未满时,
append
操作会直接在原底层数组上进行追加。这意味着
b
和
a
实际上共享同一个底层数组。 第一次
append(a, 1)
后,
a
和
b
都指向了这个底层数组,数组中只有一个元素1。第二次
append(a, 2)
直接修改了这个共享的底层数组,将元素2追加到数组中。由于
b
也指向这个底层数组,所以
b[0]
的值被覆盖为2。
b[0]
输出2,并非
b
自身被修改,而是因为
b
指向的底层数组被
a
的
append
操作改变了。 因此,当切片容量允许时,对其中一个切片进行
append
操作会影响到所有指向同一底层数组的其他切片。 理解这一点对于编写高效且无错误的Go代码至关重要。

相关文章