在线试读

get_product_contenthtml 第5章数组、切片和映射
使用任何一门编程语言来编写一个程序都会涉及读取和存储集合数据的情况。在进行数据库访问、文件访问、网络访问等操作时,使用某种数据结构来存储所接收的数据是十分必要的,而Go语言就提供了三种数据结构供用户管理集合数据: 数组、切片和映射。这三种数据结构作为Go语言核心的一部分在标准库中被广泛使用。熟练地掌握这些数据结构会使Go语言编程变得更加方便、快捷。
本章要点:
 了解数组、切片和映射的创建以及初始化过程。
 熟知数组、切片和映射的使用方法。
 掌握数组元素的元素访问过程。
 熟悉切片赋值、切片增长和切片复制的过程。
 掌握映射中元素赋值、查询和删除的方法。
5.1数组
数组是Go语言编程中常用的数据结构之一。顾名思义,数组就是指具有固定长度的一系列同一类型数据的集合。由于数组的长度固定,故在Go中很少直接使用。切片的长度可以改变,在很多场合下使用得更多。然而在理解切片之前,必须先理解数组。
数组是一种非常有用的数据结构,其所占用的内存是连续分配的。由于内存连续,CPU能把正在使用的数据缓存更久的时间,而且内存连续很容易计算索引,可以快速迭代数组中的所有元素。数组的类型信息可以提供每次访问一个元素时需要在内存中移动的距离。既然数组的每个元素类型相同,又是连续分配,就可以以固定速度索引数组中的任意数据,而且速度非常快。
以下为一些常规的数组声明方法:

[32]byte //长度为32的数组,每个元素为一个字节

[2*N] struct { x, y int32 } //复杂类型数组

[1000]*float64  //指针数组

[3][5]int  //二维数组

[2][2][2]float64  //等同于[2]([2]([2]float64))

从上述声明方法可以看出,数组可以是多维的,比如[3][5]int就表达了一个3行5列的二维整型数组,总共可以存放15个整型元素。
在Go语言中,数组长度定义后就不可更改了。在声明时长度可以为一个常量或者一个常量表达式(常量表达式是指在编译期即可计算结果的表达式)。数组的长度是该数组类型的一个内建常量,可以用Go语言的内建函数len()来获取。
5.1.1声明与初始化
声明数组时需要指定内部存储的数据的类型,以及需要存储的元素的数量,这个数量也称为数组的长度,代码如下所示:

var array [3]int

//声明一个包含三个元素的整型数组
一旦声明,数组中存储的数据类型和数组长度就都不能改变了。如果需要存储更多的元素,就需要先创建一个更长的数组,再把原来数组里的值复制到新数组中。


图51整型数组的声明


在Go语言中声明变量时,总会使用对应类型的零值来对变量进行初始化。数组也不例外。当数组初始化时,数组内每个元素都初始化为对应类型的零值。在图51中,可以看到整型数组中的每个元素都初始化为0,也就是整型的零值。

一种快速创建数组并初始化的方式是使用数组字面量。数组字面量允许在声明数组元素数量的同时指定每个元素的值,代码如下所示:

//声明一个包含五个元素的整型数组

//用具体值初始化每个元素

array := [5]int{10, 20, 30, 40, 50}

如果使用…替代数组的长度,Go 语言会根据初始化时数组元素的数量来确定该数组的长度,代码如下所示:

//声明一个整型数组

//用具体值初始化每个元素

//容量由初始化值的数量决定

array := [...]int{10, 20, 30, 40, 50}
如果知道数组的长度而且准备给每个值都指定具体值,就可以使用下面这种语法:

//声明一个有五个元素的数组

//用具体值初始化索引为 1 和 2 的元素

//其余元素保持零值

array := [5]int{1: 10, 2: 20}