文章

Go 语言容器:数组

Go 语言容器:数组

Go 语言容器:数组

概述

在 Go 语言中,数组(Array)是一个由固定长度的、特定类型元素组成的序列。一个数组可以由零个或多个元素组成。

由于数组的长度是固定的,所以在 Go 语言中很少直接使用数组。与数组相对的是 切片(Slice),切片是可以增长和收缩的动态序列,功能更灵活。但要理解切片的工作原理,首先需要理解数组。

数组的声明

数组的声明语法如下:

1
var 数组变量名 [元素数量]Type

数组的每个元素都可以通过索引下标来访问,索引下标的范围是从 0数组长度 - 1。内置函数 len() 可以返回数组中元素的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 定义一个包含三个整数的数组
var a [3]int

// 打印第一个元素
fmt.Println(a[0])

// 打印最后一个元素
fmt.Println(a[len(a)-1])

// 打印索引和元素
for i, v := range a {
    fmt.Printf("%d %d\n", i, v)
}

// 仅打印元素
for _, v := range a {
    fmt.Printf("%d\n", v)
}

默认情况下,数组的每个元素都会被初始化为元素类型对应的零值。对于数字类型,零值就是 0

初始化

您也可以使用数组字面值语法,在声明时用一组值来初始化数组:

1
2
var arr [3]int = [3]int{1, 2, 3}
var arr2 [3]int = [3]int{1, 2} // 未提供初始值的元素将默认为零值,arr2 的值为 [1, 2, 0]

如果在数组长度的位置使用 ... 省略号,则表示数组的长度是根据初始化值的个数来计算的。

1
2
3
4
arr := [...]int{1, 2, 3} // 数组长度为 3

// 编译错误:无法将 [4]int 赋给 [3]int 类型
// arr = [4]int{1, 2, 3, 4}

数组的比较

如果两个数组类型相同(包括数组的长度和元素的类型),可以直接使用比较运算符 ==!= 来判断它们是否相等。只有当两个数组的所有元素都相等时,数组才被认为是相等的。

注意:不能比较两个类型不同的数组,否则程序将无法编译。

1
2
3
4
5
6
7
8
9
10
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}

// 输出 "true false false"
fmt.Println(a == b, a == c, b == c)

d := [3]int{1, 2}
// 编译错误:无法比较 [2]int 和 [3]int
// fmt.Println(a == d)

遍历数组

遍历数组与遍历切片类似,可以使用 for...range 循环:

1
2
3
4
5
6
7
8
var team [3]string
team[0] = "hammer"
team[1] = "soldier"
team[2] = "mum"

for k, v := range team {
    fmt.Println(k, v)
}

多维数组

Go 语言支持多维数组,最常见的是二维数组。二维数组的声明和初始化如下:

```go // 声明一个 3x4 的二维数组 var array [3][4]int

// 使用数组字面值进行初始化 array = [3][4]int{ {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}, }

本文由作者按照 CC BY 4.0 进行授权