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.比较两个数组是否相等
如果两个数组类型相同(包括数组的长度,数组中元素的类型)的情况下,我们可以直接通过较运算符(==和!=)来判断两个数组是否相等,只有当两个数组的所有元素都是相等的时候数组才是相等的,不能比较两个类型不同的数组,否则程序将无法完成编译。