Go一道考察slice的面试题
2018-04-09 本文已影响18人
流芳不待人
解释下面现象:
func main() {
s := []int{5}
s = append(s, 7)
s = append(s, 9)
x := append(s, 11)
y := append(s, 12)
fmt.Println(s, x, y)
}
//结果是:[5 7 9] [5 7 9 12] [5 7 9 12]
因为slice相当于数组的视图,实际保存数据的是数组。当向slice添加元素时实际是在向数组中添加。
如果添加的数据超过了数组cap
的大小,就会重新申请一个更大的数组,将元素复制过去。
这里的s
原本的cap
值是4,追加元素没有超过4,所以一直都是在同一个数组里操作。
func main() {
s := []int{5}
fmt.Println(cap(s)) //1
s = append(s, 7)
fmt.Println(cap(s)) //2
s = append(s, 9)
fmt.Println(cap(s)) //4
x := append(s, 11)
y := append(s, 12)
fmt.Println(s, x, y) //[5 7 9] [5 7 9 12] [5 7 9 12]
}