Go语言append函数输出异常咨询:为何结果不符合预期?
Go切片append行为导致输出异常的原因
这是因为Go语言的切片是底层数组的引用视图,结合append函数的扩容规则导致的:
- 先看x的容量变化:初始x是空切片,经过三次
append添加0、1、2后,x的长度是3,容量会扩容到4(Go切片扩容策略:当当前容量小于1024时,新容量是原容量的2倍,初始空切片append第一个元素后容量为1,第二个为2,第三个append时容量翻倍到4)。 - 创建y时:
y := append(x,3),此时x的容量是4,长度3,添加元素3后长度为4,没超过容量,所以append直接在x的底层数组的第4个位置(索引3)写入3,y和x共享同一个底层数组,y的长度是4,容量4。 - 创建z时:
z := append(x,4),此时x的长度还是3(x本身没被修改),容量依然是4,所以append还是在同一个底层数组的索引3位置写入4,直接覆盖了之前的3。 - 最后打印y和z时,它们指向的是同一个底层数组,所以输出都是
[0 1 2 4]。
如果要得到预期的[0 1 2 3] [0 1 2 4],可以在创建y时先复制x的内容到新切片,比如y := append([]int(nil), x...)再append 3,这样y会拥有独立的底层数组,不会被后续的z操作覆盖。
内容的提问来源于stack exchange,提问作者R S
相关产品推荐
相关产品推荐

