Go一道考察slice的面试题

解释下面现象:

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]
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,...
    Tuberose阅读 18,522评论 1 46
  • 安装和环境配置 自行百度解决 go项目的目录结构 go命令依赖一个重要的环境变量:$GOPATH一般的,一个Go项...
    名字刚好七个字阅读 386评论 0 0
  • 一直觉得自己是个脾气很急的人,对同事尚能忍,对家人就比较随性。在家里时常为些小事大喊大叫,自己也觉得心跳加快...
    D009十字阅读 93评论 1 1
  • 1.readfile() 读取文件,并把它写入输出缓冲。 readfile("demo.txt"); 2.fop...
    Separes阅读 2,187评论 0 0
  • 今天是周六,天气晴朗伴有微风。七点多就传来隔壁二兄弟在床上玩耍的声音,嘿,今天不用上学没赖床啊,我倒是想赖床了,八...
    向往精灵阅读 245评论 0 0