[TOC]
数组Array
一 数组介绍
数组是一组同一类型数据的集合,也就是说数组内的数据/元素的类型必须相同。此外,数组还有一些其他特点,如下所示
1、一个数组包含的元素个数被称为数组的长度(可以用内置函数len(数组)来统计数组长度),数组的长度不可改变,而数组内的元素是可以改变的
2、数组是采用索引对应元素,可以通过索引访问/修改数组内的元素,索引从0开始,到len(数组)-1结束,不支持负向索引
3、数组是值类型,传递数组的开销比较大
数组的特点决定了其使用的局限性,因此在Go语言中很少直接使用数组。和数组对应的类型是Slice(切片),它是可以增长和收缩动态序列,slice的使用更为灵活,并且切片是引用类型。传递开销小,因此切片要比数组更为常用一些,但是要理解slice工作原理的话需要先理解数组。
二 数组定义
var 数组变量名 [元素数量]T
// 例如定义一个长度为3元素类型为int的数组a
var a [3]int
注意:因为数组的长度需要在编译阶段确定,所以在声明时数组时,数组的长度必须是常量或者一个常量表达式(常量表达式是指在编译期即可计算结果的表达式),并且长度是数组类型的一部分。一旦定义,长度不能变。 [3]int
和[5]int
是不同的类型。
var a [3]int
var b [5]int
a = b // 错误,因为此时a和b是不同的类型,
三 数组的初始化
默认情况下,数组的每个元素都被初始化为元素类型对应的零值,对于数字类型来说就是0。
var a [3]int
fmt.Println(a) // [0 0 0]
我们可以用三种方式来为数组初始化值
1、使用数组字面值语法用一组值来初始化数组
// 使用指定的初始值完成初始化,长度为3,初始化了前两个值,第三个值用零值填充
var numArray [3]int = [3]int{111, 222}
// 使用指定的初始值完成初始化,当然可以用类型推导,上一行代码也一样
var cityArray = [3]string{"北京", "上海", "深圳"}
fmt.Println(numArray) // [111 2222 0]
fmt.Println(cityArray) // [北京 上海 深圳]
2、在数组字面值中,用“…”省略号代替长度,数组的长度会根据初始化值的个数推导出来
var cityArray = [...]string{"北京", "上海"}
fmt.Println(cityArray) // [北京 上海]
fmt.Printf("%T",cityArray) // [2]string
3、我们还可以使用指定索引值的方式来初始化数组
// 索引分配到了5,所以总共有6个元素,初始化了两个元素,其余元素用零值初始化
nums := [...]int{1: 111, 5: 222} // var z =[...]int{1:11111111}
fmt.Println(nums) // [0 111 0 0 0 222]
fmt.Printf("%T\n", nums) // [6]int
四 基于索引访问数组元素
数组可以通过下标进行访问,下标是从0
开始,最后一个元素下标是:len(数组)-1
,不支持负向索引,访问越界(下标在合法范围之外),则触发访问越界,会panic。
var cityArray = [3]string{"北京", "上海", "深圳"}
fmt.Println(cityArray[0]) // 北京
// 不支持负向索引,如果我们想取末尾的值,可以用len(cityArray)-1这种方式计算得到,也很方便
fmt.Println(cityArray[len(cityArray)-1]) // 深圳
fmt.Println(cityArray[-1]) // 错误,索引必须是非负的
五 遍历数组元素
cityArray := [...]string{"北京", "上海", "深圳"}
// 遍历数组元素的方法1:基于索引
for i := 0; i < len(cityArray); i++ {
fmt.Println(cityArray[i])
}
// 遍历数组元素的方法2:基于range
for index, value := range cityArray {
fmt.Println(index, value)
}
六 多维数组
Go语言是支持多维数组的,我们这里以二维数组为例(数组中又嵌套数组)。