切片作为参数传参,使用 append 后在函数内切片被修改了,而在主函数里面没有被改变

yagamil · · 1194 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

```go package main import "fmt" func main() { arr := make([]int, 3, 4) //创建一个长度为 3 ,容量为 4 的切片 fmt.Println(arr, len(arr), cap(arr)) //[0 0 0] 3 4 // ----- fmt.Printf("%p\n", arr) addNum(arr) // ----- fmt.Println(arr, len(arr), cap(arr)) //[0 0 0] 3 4 fmt.Printf("%p\n", arr) } func addNum(sli []int) { fmt.Printf("%p\n", sli) sli = append(sli, 4) fmt.Println(sli, len(sli), cap(sli)) //[0 0 0 4] 4 4 fmt.Printf("%p\n", sli) } ``` 看到网上的解释是, 在 addNum 里面,sli 的底层数组是的确被修改了,可是切片的 len 由于是值复制,所以切片的 len 没有被修改,导致外层 main 里面的切片没有被显示? 如果是这样,那么应该传参的时候传入的切片地址应该不一样才对,因为是传值,传入的是切片结构体的拷贝值,而不应该是切片的原地址。 type slice struct { array unsafe.Pointer //存储数组指针 len int cap int } 望大神指点。 有个大神的回复: > 打印的是切片里引用的底层数据的地址,而不是切片本身的地址。实参和形参的切片是不同的切片,只不过它们引用的底层数据是一样的。 那么请问下,addNum(arr) 这个arr是值传递,传的是切片的地址值,还是切片里面的结构体的array地址 ?

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1194 次点击  
加入收藏 微博
6 回复  |  直到 2021-11-18 00:54:30
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传