下面这段代码输出什么?
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)
}
下面这段代码输出什么?
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)
}
`单行代码`
mark
第一次的 change() 里面传入的是 slice=[1,2,0,0,0],len = 5,cap = 5,尽管 append() 修改了底层数组,但是 len,cap 不变,所以 slice 仍然为 [1,2,0,00]; 第二次的 change() 里面传入的是 slice=[1,2,0,0,0],len = (2-0) = 2,cap = 5,所以 append() 的时候,尽管 len,cap 不变,但是 append() 修改的时 idx=2 时的元素,打印的是 slice,len = 5,所以最终输出的就是 [1,2,3,0,0] 注意:语法糖仍然是将数组传递进去,但是函数内部仍然会拷贝切片副本
[1 2 0 0 0 ] [1 2 3 0 0] 第一个,更换了底层数组,第二个没有更换底层数组
mark
第一次调用 change() 时,append() 操作使切片底层数组发生了扩容,这里为什么会发生扩容?
mark
mark
因为切片初初始化时指定了长度,那么切片就会初化成指定长度的零值,也是就初化化后切片是这样的:[0,0,0,0,0]