刚入门的小白请教大佬们一个关于切片的问题

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

楼主只是简单想测试一下切片的**删除头**和**删除中间**的部分,所以写了一个小demo测试一下,但是运行结果却很让我出乎意料 --- 先贴上代码: ```go package main import "fmt" func main() { fmt.Println("测试:") var st []int for i:=0;i<12;i++{ st=append(st,i) } fmt.Println("原切片:") fmt.Println(st) fmt.Println("删除切片指定头:") test1(st,2) fmt.Println(st) fmt.Println("删除切片指定位置:") test2(st,5) fmt.Println(st) } // 去除切片头,测试切片是否为引用传递? func test1(s []int,i int){ s = s[i:] } //去除中间 func test2(s []int,i int) { // 和js6类似s[]...表示将数组转化为一列参数输入 s = append(s[:i],s[i+2:]...) } ``` --- 以下是运行结果 ```bash 测试: 原切片: [0 1 2 3 4 5 6 7 8 9 10 11] 删除切片指定头: [0 1 2 3 4 5 6 7 8 9 10 11] 删除切片指定位置: [0 1 2 3 4 7 8 9 10 11 10 11] Process finished with exit code 0 ``` --- 可以看到**删除头**的操作并没有成功 楼主一开始的理解是,**go语言所有参数传递默认是值传递,所以传递过去的切片只是一个副本,在函数内部改变切片值是不起作用的** 但是下面这个函数的运行`s = append(s[:i],s[i+2:]...)`就诡异了 原数组[0 1 2 3 4 5 6 7 8 9 10 11],输入值为2,运行结果是下面这个: [0 1 2 3 4 7 8 9 10 11 10 11] **切片中间的5,6的确是删除了**,可以看到切片的确是以引用的形式传到了函数内部,但后面的两位出现了重复,这是什么鬼? 百般思索下,觉得是在函数里不能对原切片的cap和len进行修改,只能作值的修改?切片映射的原数组会自动填补上缺失的部分?但是第一个函数也删去了切片的头值,但切片根本就没变啊? 求大佬们解决一下萌新的疑惑QAQ

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

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

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