切片【Golang】
来自智得网
简介
一般编程语言的数组都是静态大小的,由列表等数据结构提供动态大小的线性数据结构。但是Golang语言提供了可以自动扩容的动态数组——切片(Slice),切片支持追加,遍历,截取、随机访问等能力。
原理
Golang中的切片由切片数据结构以及底层数组构成。
Golang的数据结构是一个值类型的结构体,包含的信息如下:
指向底层数组的指针,切片结构体本身不存储数据,数据都存储在底层的数组上。
切片的长度指切片中元素的个数。
切片的容量是指底层数组可以容纳的元素个数。
切片中元素不一定是从数组的起始位置开始的,所以切片的容量不一定是底层数组的长度,而是底层数组长度减去第一个元素的位置。
多个切片可以复用底层的同一个数组,所以对数组中数值的修改会反应在每个应用它的切片上。
当append数据,切片底层的数组长度不足时,会启动扩容的机制,产生一个新的数组,将数据拷贝到新的数组上。
使用
Golang也提供数组类型的数据结构,数组是长度是不可变化的,需要在声明数组的时候确定的长度的值,一般是传入明确的数组长度或者通过数组的值而确定数组的长度。
切片的声明和数组类似,但是不需要传入切片的长度,或者通过make方式构建,此时传入一个初始长度。
// 定义数组
array1:= [10]int{}
array2:= [...]int{1,2,3,4,5}
var array3 [7]float32
// 定义切片
var slice1 []int
var slice2:= make([]int, 5)
slice3:= []int{1, -1 ,0, 1, 4}
// 二维切片定义,需要分别初始化二维切片和每一项一维切片
row, column:= 3, 4
var matrix [][]int
for i:= 0; i < row; i++ {
inline:= make([]int, column)
matrix = append(matrix, inline)
}
切片不能使用“==”进行比较,所以切片不能作为map结构的Key。