- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
03.3.2 切片的扩容
切片有两个主要的属性:容量
和长度
,而且这两个属性的值往往是不一样的。一个与数组拥有相同数量元素的切片,二者的长度是相同的,且均可以通过函数len()
获得。切片的容量是指切片能够容纳的元素空间,可以通过cap()
函数获得。由于切片的大小是动态变化的,如果一个切片超出了其设置的容量,Go会自动将该切片的长度变为原来的两倍,以存放超出的元素。
简单来说,当切片的容量和长度相等时,你再往该切片追加元素,切片的容量就会变为原来的两倍,当然长度增加1。然而这种操作可能对于小的切片效果比较好,对于大型切片来说会占用的内存会超出你预期。
下面的代码lenCap.go分三部分,清楚地阐述了切片的容量与长度的变化规律,第一部分代码:
> package main
>
> func printSlice(x []int) {
> for _, number := range x {
> fmt.Println(number," ")
> }
> fmt.Println()
> }
printSlice()打印一个slice的所有元素。
第二部分代码:
> func main() {
> aSlice := []int{-1, 0, 4}
> fmt.Printf("aSlice: ")
> printSlice(aSlice)
>
> fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice))
> aSlice = append(aSlice, -100)
> fmt.Printf("aSlice: ")
> printSlice(aSlice)
> fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice))
这部分代码中,我们往aSlice中添加元素以出发其长度和容量的变化。
第三部分代码:
> aSlice = append(aSlice, -2)
> aSlice = append(aSlice, -3)
> aSlice = append(aSlice, -4)
> printSlice(aSlice)
> fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice))
> }
以上代码的执行结果是:
> $ go run lenCap.go
>
> aSlice: -1
> 0
> 4
>
> Cap: 3, Length: 3
> aSlice: -1
> 0
> 4
> -100
>
> Cap: 6, Length: 4
> -1
> 0
> 4
> -100
> -2
> -3
> -4
>
> Cap: 12, Length: 7
正如输出所示,初始的切片长度和容量均是3,在添加一个元素之后,其长度变为4,然后容量变为6。继续往切片中追加元素,其长度变为7,容量再一次翻倍即变为12。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论