slice

问题:下面这段代码输出什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
func change(s ...int) {
s = append(s,3)
}

func main() {
slice := make([]int,5,5)
slice[0] = 1
slice[1] = 2
change(slice...)
fmt.Println(slice)
change(slice[0:2]...)
fmt.Println(slice)
}

答案如下

1
2
[1 2 0 0 0]
[1 2 3 0 0]

原因:

​ 第一次调用change函数时,在函数内需要往切片里加入一个元素,但此时slice切片的长度已经达到了容量的上限,故需要扩容。当一个slice需要扩容时,Go会创建一个新的数组,将原有数组的元素复制到新数组中,并将新的元素插入到新数组中,故原slice的底层数组不变

​ 第二次调用change函数时,使用了操作符[i,j]获得一个新的切片,假定为 slice1,它的底层数组和原切片底层数组是重合的,不过 slice1 的长度、容量分别是 2、5,没有达到容量的上限,所以在使用 change() 函数中对 slice1增加元素时,底层数组的修改会影响到原切片。


slice
http://example.com/2023/04/20/Go每日一题/slice/
作者
Feng Tao
发布于
2023年4月20日
更新于
2023年4月21日
许可协议