数组的内部实现和基础功能
因为数组是切片和映射的基础数据结构。理解了数组的工作原理,有助于理解切片和映射提供的优雅和强大的功能。
内部实现
在Go语言里,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块。
下图中可以到数组的表示。
数组是一种非常有用的数据结构,因为其占用的内存是连续分配的。由于内存连续,CPU能把正在使用的数据缓存更久的时间。而且内存连续很容易计算索引,可以快速迭代数组里的所有元素。数组的类型信息可以提供每次访问一个元素时需要在内存中移动的距离。
声明和初始化
声明数组时需要指定内部存储的数据的类型,以及需要存储的元素的数量,这个数量也称为数组的长度,如下:
// 声明一个包含5个元素的整型数组
var array [5]int
一种快速创建数组并初始化的方式是使用数组字面量。
array := [5]int{10,20,30,40,50}
使用数组
要访问数组里某个单独元素,使用[]运算符,如:
// 声明一个包含5个元素的整型数组
// 用具体值初始化为每个元素
array := [5]int{10,20,30,40,50}
// 修改索引为2的元素的值
array[2] = 35
使用*运算符就可以访问元素指针所指向的值,如:
// 声明包含5个元素的指向整数的数组
// 用整型指针初始化索引为0和1的数组元素
array := [5]*int{0: new(int), 1: new(int)}
// 为索引为0和1的元素赋值
*array[0] = 10
*array[1] = 20
在Go语言里,数组是一个值。这意味着数组可以用在赋值操作中。变量名代表整个数组,因此,同样类型的数组可以赋值给另一个数组:
// 声明一个包含5个元素的字符串数组
var array1 [5]string
// 声明第二个包含5个元素的字符串数组
// 用颜色初始化数组
array2 := [5]string{"Red","Blue","Green","Yellow","Pink"}
// 把array2的值复制到array1
array1 = array2
数组变量的类型包括数组长度和每个元素的类型。只有这两部分都相同的数组,才是类型相同的数组,才能互相赋值。
复制指针数组,只会复制指针的值,而不会复制指针所指向的值。
var array [3]*string
array2 := [3]*string{new(string), new(string), new(string)}
*array2[0] = "Red"
*array2[1] = "Blue"
*array2[2] = "Green"
array1 = array2
多维数组
数组本身只有一个维度,不过可以组合多个数组创建多维数组。
var array [4][2]int
array := [4][2]int{{10,11},{20,21},{30,31},{40,41}}
array := [4][2]int{1: {20,21},3: {40,41}}
array := [4][2]int{1: {0: 20},3: {1: 41}}