GoGo面试宝典

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]
}
上一篇 下一篇

猜你喜欢

热点阅读