切片【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。