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