1. 数组的概念
数组是相同类型的一组数据构成的长度固定的序列,其中数据类型包含了基本数据类型、复合数据类型和自定义类型。数组中的每一项被称为数组的元素。数组名是数组的唯一标识符,数组的每一个元素都是没有名字的,只能通过索引下标(位置)进行访问。因为数组的内存是一段连续的存储区域,所以数组的检索速度是非常快的,但是数组也有一定的缺陷,就是定义后长度不能更改。
2.数组的语法
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下。
var 变量名 [数组长度] 数据类型
以上为一维数组的定义方式,数组长度必须是整数且大于 0,未初始化的数组不是 nil,也就是说没有空数组(与切片不同)。
初始化数组语法格式如下。
var nums = [5]int{1,2,3,4,5}
初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
如果忽略 [] 中的数字,不设置数组长度,Go 语言会根据元素的个数来设置数组的长度。可以忽略声明中数组的长度并将其替换为「…」。编译器会自动计算长度。语法格式如下。
var nums = [...]int{1,2,3,4,5}
以上两种初始化方式效果相同,虽然第二种没有设置数组的长度。
修改数组内容,语法格式如下。
num[4] - 4
以上实例读取数组第 5 个元素。数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第 1 个元素索引为 0,第 2 个索引为 1,以此类推。
3.数组的长度
数组的长度是数组的一个内置常量,通过将数组作为参数传递给 len()函数,可以获得数组的长度。忽略声明中数组的长度并将其替换为「…」,编译器可以找到长度。
例 : 获取数组长度。
package main
import "fmt"
func main() {
a := [4]float64{67.7, 89.8, 21, 78}
b := [...]int{2, 3, 5}
fmt.Printf("数组a的长度为%d,数组b的长度:%d", len(a), len(b))
}
运行结果:
数组a的长度为4,数组b的长度:3
4.遍历数组
在数组中查找目标元素,需要进行遍历。
例 : 遍历数组。
package main
import "fmt"
func main() {
a := [4]float64{67.7, 89.8, 21, 78}
b := [...]int{2, 3, 5}
//遍历数组方式一
for i := 0; i < len(a); i++ {
fmt.Print(a[i], "\t")
}
//遍历数组方式二
for _, value := range b {
fmt.Print(value, "\t")
}
}
5.多维数组
由于数据的复杂程度不一样,数组可能有多个下标。一般将数组元素下标的个数称为维数,根据维数,可将数组分为一维数组、二维数组、三维数组、四维数组等。二维及以上的数组可称为多维数组。
Go 语言的多维数组声明方式:
var variable_name [size][size]...[size] variable_type
1.二维数组
二维数组是最简单的多维数组,二维数组的本质也是一个一维数组,只是数组成员由基本数据类型变成了构造数据类型(一维数组)。
二维数组的定义方式如下。
var arrayName [x][y]variable_type
二维数组初始化,语法格式如下。
a = [3][4]{
{1,3,4,5} //第一行索引为0
{4,4,6,7} //第二行索引为1
{4,5,7,2} //第三行索引为2
}
上述定义的二维数组共包含 3×4 个元素,即 12 个元素。接下来,我们通过一张图来描述二维数组 a 的元素分布情况,如图所示。
二维数组元素通过指定坐标来访问,如数组中的行索引与列索引。语法格式如下。
int var = a[1][2]
例: 二维数组嵌套循环输出。
package main
import "fmt"
func main() {
var a = [5][2]int{{0, 0}, {1, 2}, {2, 4}, {3, 6}, {4, 8}}
fmt.Println(len(a))
fmt.Println(len(a[0]))
//输出数组元素
for i := 0; i < len(a); i++ {
for j := 0; j < len(a[0]); j++ {
fmt.Printf("a[%d][%d] = %d\n", i, j, a[i][j])
}
}
}
2.三维数组
三维数组的本质也是一个一维数组,只是数组成员由基本数据类型变成了构造数据类型(二维数组),多维数组在实际的工作中极少使用,并且使用方法与二维数组相似,如同阅兵仪式的多个方阵。
定义三维数组的语法格式如下。
var threedim [3][4][6]int
6.数组是值类型
Go 语言中的数组并非引用类型,而是值类型。当它们被分配给一个新变量时,会将原始数组复制出一份分配给新变量。因此对新变量进行更改,原始数组不会有反应。下面通过一个案例来验证原始数组是否被更改。
例:数组被分配给一个新变量。
package main
import "fmt"
func main() {
a := [...]string{"USA", "China", "India", "Germary", "France"}
b := a
b[0] = "Singapore"
fmt.Println("a:", a)
fmt.Println("b :", b)
}
运行结果:
a: [USA China India Germary France]
b : [Singapore China India Germary France]
注意:将数组作为函数参数进行传递,它们将通过值传递,原始数组依然保持不变。
7.比较两个数组是否相等
如果两个数组类型相同(包括数组的长度,数组中元素的类型)的情况下,我们可以直接通过较运算符(==和!=)来判断两个数组是否相等,只有当两个数组的所有元素都是相等的时候数组才是相等的,不能比较两个类型不同的数组,否则程序将无法完成编译。