Go语言函数参数采用值传递,但修改函数内切片元素却能影响外部切片,这并非与值传递矛盾。 理解Go切片的工作原理是关键。
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语言免费学习笔记(深入)
”;
然而,
函数的行为不同。
会尝试在原切片底层数组添加元素。若空间不足,它会分配新的更大数组,复制原元素,再添加新元素,并返回指向新数组的新切片。 原切片仍指向旧数组,因此外部切片不受影响。
函数潜在的创建新底层数组是关键区别。直接索引修改操作共享的底层数组,而
可能创建新的数组。 这就是Go语言切片值传递特性和底层数组共享机制的体现。
arr[0] = 100appendappendappendappend