前言
数组与切片是 Go 语言中比较常见的数据结构之一,但是很多初学者往往会混淆两者之间的关系与作用。
数组
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
数组的声明如下:
var 数组变量名 [数组长度]数组类型
// 例如 声明一个长度为 5 的整型数组
var arr [5]int
数组的赋值:
arr[0] = 0
arr[1] = 1
// 或声明加定义
arr := [5]int{1, 2, 3, 4, 5}
当数组长度不确定时可以使用 ... 语法糖来让编译器自动计算数组大小。
var arr [...]int
多维数组声明
// 二维数组
var arr2 [5][5]int
// 三维数组
var arr3 [1][2][3]int
// 更多维度
var 数组变量名 [SIZE1][SIZE2]...[SIZEN] 数组类型
注意
数组传值是引用类型。
切片
切片(Slice)是对数组的抽象,Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
切片初始化
切片初始化一共有三种方式:
// 第一种:未附加长度的数组
var slice1 []int
// 第二种 make
slice2 := make([]类型, 长度, 切片容量)
// 第三种:通过下标获取
arr := [5]int{1, 2, 3, 4, 5}
slice3 := arr[2:4]
len() & cap()
切片是可索引的,可以使用 len 函数用于获取切片长度。
cap 函数用于获取切片容量,可以测量切片最长可以达到多少。
append() & copy()
append 函数用于向切片追加元素,它可以同时追加多个元素。
slice := make([]int)
append(slice, 1, 2, 3, 4)
copy 函数用于拷贝切片。
结语
它们的共同点是都属于集合类的类型,并且,它们的值也都可以用来存储某一种类型的值(或者说元素)。
不过,它们最重要的不同是:数组的长度是固定的,而切片是可变长的。
数组的长度在声明它的时候就必须给定,并且之后不会再改变。可以说,数组的长度是其类型的一部分。