在 Go 语言中slice 是值传递所有类型都是值传递但修改 slice 的元素可以影响到外部。详细解释1. 值传递的本质当你传递 slice 给函数时传递的是 slice 头的副本。slice 头包含三个字段指向底层数组的指针长度len容量captypesliceHeaderstruct{Datauintptr// 指向底层数组的指针LenintCapint}2. 修改元素 -可以影响外部funcmodifyElement(s[]int){s[0]100// 修改底层数组的元素}funcmain(){nums:[]int{1,2,3}modifyElement(nums)fmt.Println(nums)// [100 2 3] ✅ 外部被影响}原因副本中的Data指针指向同一个底层数组。3. 修改长度/容量 -不能影响外部funcmodifyLen(s[]int){sappend(s,4)// 可能改变 len 和 cap甚至指向新数组s[0]100}funcmain(){nums:[]int{1,2,3}modifyLen(nums)fmt.Println(nums)// [1 2 3] ❌ 外部不受影响}4. 使用指针才能完全修改funcmodifySlice(s*[]int){*sappend(*s,4)// 修改原 slice(*s)[0]100}funcmain(){nums:[]int{1,2,3}modifySlice(nums)fmt.Println(nums)// [100 2 3 4] ✅ 完全受控}总结修改元素✅ 影响外部共享底层数组修改长度/容量❌ 不影响外部副本的 len/cap 独立重新赋值整个 slice❌ 不影响外部副本的 Data 指针改变需要完全修改时使用指针*[]T或返回新 slice这种设计兼顾了性能和安全性是最常见的 Go 语言实践。