You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言切片底层数组共享问题:append操作的疑惑

Go中append后原切片与新切片输出不同的原因

你忽略了**切片的长度(len)**这个核心属性,这才是导致输出差异的关键:

  1. 你创建的names切片:

    var names = make([]string, 4, 10)
    

    它的len是4,cap是10——这意味着names只能访问底层数组的前4个元素(此时都是空字符串),哪怕底层数组有10个位置的容量。

  2. 执行append(names, "Tom")时,因为原切片容量充足,确实复用了原底层数组,把"Tom"放到了底层数组的第5个位置(索引4)。但append返回的新切片names1会自动把len更新为5,所以打印names1时,会显示前5个元素(4个空字符串 + "Tom")。

  3. 而原切片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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:00:09