golang的slice作为函数参数传值的坑

ziyouchutuwenwu · 2014-10-04 19:26:12 · 9597 次点击 · 预计阅读时间不到 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2014-10-04 19:26:12 的文章,其中的信息可能已经有所发展或是发生改变。

直接贴代码

func sliceModify(slice []int) {
    // slice[0] = 88
    slice = append(slice, 6)
}
func main() {
    slice := []int{1, 2, 3, 4, 5}
    sliceModify(slice)
    fmt.Println(slice)
}

 

返回的没变,坑爹的,这个设计太那啥了,可以正确跑出效果的版本如下:

func sliceModify(slice *[]int) {
    *slice = append(*slice, 6)
}
func main() {
    slice := []int{1, 2, 3, 4, 5}
    sliceModify(&slice)
    fmt.Println(slice)
}

 


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

本文来自:博客园

感谢作者:ziyouchutuwenwu

查看原文:golang的slice作为函数参数传值的坑

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

9597 次点击  
加入收藏 微博
2 回复  |  直到 2000-01-01 00:00:00
spaker
spaker · #1 · 9年之前

第一段代码里面,那是两个不同的slice对象,虽然他们底层数据是同一块,自然就不能将主函数里面的slice修改了 第二段代码里面,那是个指针,你产生了一个新的slice对象,你再把新的slice对象赋给指针,调用函数之前和之后指针指向的地址是不同的。

slice是引用类型,它的底层数据是同一块,使用append会产生一个新的对象,slice类型除了底层数据还有其他的数据,而长度未超过容量时,还是同一块区域。

spaker
spaker · #2 · 9年之前
spakerspaker #1 回复

第一段代码里面,那是两个不同的slice对象,虽然他们底层数据是同一块,自然就不能将主函数里面的slice修改了 第二段代码里面,那是个指针,你产生了一个新的slice对象,你再把新的slice对象赋给指针,调用函数之前和之后指针指向的地址是不同的。 slice是引用类型,它的底层数据是同一块,使用append会产生一个新的对象,slice类型除了底层数据还有其他的数据,而长度未超过容量时,还是同一块区域。

说错了,第二段代码,指针地址是一样的,但你把原来的slice类型数据用函数里面新的slice都覆盖了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传