Go语言切片底层数组共享问题:append操作的疑惑
Go中append后原切片与新切片输出不同的原因
你忽略了**切片的长度(len)**这个核心属性,这才是导致输出差异的关键:
你创建的
names切片:var names = make([]string, 4, 10)它的
len是4,cap是10——这意味着names只能访问底层数组的前4个元素(此时都是空字符串),哪怕底层数组有10个位置的容量。执行
append(names, "Tom")时,因为原切片容量充足,确实复用了原底层数组,把"Tom"放到了底层数组的第5个位置(索引4)。但append返回的新切片names1会自动把len更新为5,所以打印names1时,会显示前5个元素(4个空字符串 + "Tom")。而原切片
names的len始终是4,它的访问范围被限制在前4个元素,哪怕底层数组第5个位置已经有值了,names也看不到。
验证底层数组共享的代码
你可以通过以下代码确认两者确实共享底层数组:
package main import "fmt" func main() { var names = make([]string, 4, 10) names1 := append(names, "Tom") // 修改names1的第一个元素,观察names是否变化 names1[0] = "Alice" fmt.Println(names) // 输出: [Alice ],证明底层数组共享 // 手动扩展names的长度到5,就能看到Tom了 names = names[:5] fmt.Println(names) // 输出: [Alice Tom] }
总结:append在容量充足时会复用原底层数组,但原切片的长度不会自动更新,只有返回的新切片会调整长度,这就是两者输出不同的原因。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

