一边上代码,一边上问题吧~
slice := [...]int{4, 5, 6, 7}
slice2 := slice[:2]
append 添加切片内容后,原来的slice会变成什么呢?
slice2 = append(slice2, 0)
slice的内容变为了 4 5 0 7
这很容易理解,因为slice2引用了slice的地址。所以在slice2的未位加了0,就把6顶掉了。
那么,slice2后再加2,1,3,看看slice会变成什么
slice2 = append(slice2, 2, 1, 3)
//append可以连接两个slice,但是必须在slice后面加...`
slice:[4 5 0 7]
slice2:[4 5 0 2 1 3]
为什么slice没有变化?因为slice2连接上2,1,3之后,明显超出了slice的长度4,go就会重新申请一块新的内存放入[4 5 0 2 1 3]并传给slice2。
连接两个slice的操作如下:
slice3 := append(slice[:], slice2...)
slice3:[4 5 0 7 4 5 0 2 1 3]
那如果把slice作为参数,在另一个函数中修改了slice的值,那么原来的slice值还会变么?
func f2(slice []int){
slice=append(slice,2,2,2,2)
}
f2(slice3)
slice3的值依旧为:[4 5 0 7 4 5 0 2 1 3]
在go中,大部分这种情况,只要不是传地址,都是值传递,而不是引用传递。
网友评论