赞
踩
这个一篇关于Go切片的文章,应该能满足你 99%的Go切片的使用场景
01.
切片的内部实现和基础功能
切片是围绕着动态数组的概念来构建的,它跟数组类似,是用于管理数据集合的一种数据结构。
数组一旦创建就不能更改其长度和类型,而切片就不同,切片可以按需自动增长和缩小,增长一般使用内置的 append 函数来实现,而缩小则是通过对切片再次进行切割来实现。
切片内部实现
切片对底层数组进行了抽象,并提供相关的操作方法,其内部包含3个字段:指向底层数组的指针、切片访问的元素的个数(即长度)、切片运行增长到的元素个数(即容量)。
02.
切片的创建与初始化
切片的创建有两种方式:一种是使用 make 函数来创建,另一种是使用字面量方式创建。
// 使用 make 函数创建切片// var 切片变量 = make([]类型, 长度, 容量)var slice = make([]int, 5, 5)
make 函数声明切片时,第二个参数必填,但第三个参数可以不填,不写第三个参数时,其容量默认等于长度值,但是如果指定容量,那容量一定不能小于长度。
以下两种方式声明是等价的。
// 以下两种声明方式是等价的// 方式1var slice = make([]int, 5)// 方式2var slice = make([]int, 5, 5)
声明并初始化切片时,可以指定所有的元素,也可以只初始化部分元素,此时需要指定要初始化的元素索引。
- // 声明并初始化切片// 在声明切片时,指定切片所有元素var slice = []int{
- 1, 2, 3}// 初始化部分元素// 初始化索引为1的元素为1,索引2为6, 索引5为10var slice = []int{
- 1:1, 2:6, 5:10}
使用字面量声明切片时,有两种特殊情况:一是空切片,二是 nil 切片。
这两种情况创建出来的切片,其长度为0,是不能直接通过下标的方式来赋值的。
// 使用字面量声明切片// 情况一:空切片// 切片的元素值是切片类型的零值,即 int 0, string '', 引用类型 nilvar slice = []int{}// 尝试赋值会报错:runtime error: index out of range [0] with length 0slice[0] = 1// 情况二:nil 切片var slice []int// 尝试赋值会报错:runtime error: i
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。