Go 语言数组(Array)
在 Go 语言中,数组是一组固定大小的同类型元素的集合。与其他编程语言不同,Go 的数组是值类型,这意味着在将数组传递给函数时,数组会被复制。如果修改数组的元素,不会影响原数组。
1. 数组的定义与初始化
1.1 定义数组
Go 中定义数组的基本语法是:
var arrayName [size]DataType
- size:数组的大小,指定数组中可以存储的元素数量。
- DataType:数组元素的类型。
示例:
var arr [5]int // 定义一个包含 5 个整数的数组
1.2 初始化数组
在 Go 中,数组可以在定义时进行初始化。可以通过以下两种方式进行初始化:
1.2.1 使用数组字面量初始化
通过数组字面量(直接赋值)初始化数组:
arr := [5]int{1, 2, 3, 4, 5} // 初始化数组并赋值
1.2.2 使用 ... 自动推导数组大小
Go 允许在初始化数组时省略数组的大小,编译器会根据提供的元素个数自动推导数组大小:
arr := [...]int{1, 2, 3, 4, 5} // 自动推导数组大小为 5
1.2.3 部分初始化
你也可以只初始化数组的一部分,未初始化的元素会自动被赋予零值(对于数字类型为 0,对于布尔类型为 false):
arr := [5]int{1, 2} // 其他元素会被初始化为 0
fmt.Println(arr) // 输出:[1 2 0 0 0]
2. 访问数组元素
Go 数组的元素是通过下标(索引)访问的。数组的下标从 0 开始。
2.1 访问和修改数组元素
arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(arr[0]) // 输出第一个元素:1
arr[1] = 10 // 修改第二个元素
fmt.Println(arr[1]) // 输出修改后的第二个元素:10
3. 数组的长度
Go 数组的长度是固定的,并且可以通过内置的 len() 函数获得数组的长度。
arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(len(arr)) // 输出数组的长度:5
4. 多维数组
Go 语言也支持多维数组,可以通过多个维度来定义一个数组。
4.1 二维数组
二维数组可以看作是数组的数组:
var arr [2][3]int // 定义一个 2x3 的二维数组
arr[0][0] = 1
arr[0][1] = 2
arr[0][2] = 3
arr[1][0] = 4
arr[1][1] = 5
arr[1][2] = 6
fmt.Println(arr) // 输出:[[1 2 3] [4 5 6]]
4.2 动态大小的二维数组
Go 中的二维数组大小是固定的。如果需要动态大小的二维数组,可以使用切片(slice)。
// 使用切片初始化二维数组
arr := [][]int{
{1, 2, 3},
{4, 5, 6},
}
fmt.Println(arr) // 输出:[[1 2 3] [4 5 6]]
5. 数组是值类型
在 Go 中,数组是值类型。传递数组时,实际是传递了数组的副本。如果修改传入的数组副本,原数组不受影响。
示例:
package main
import "fmt"
func modifyArray(arr [5]int) {
arr[0] = 100 // 修改数组的第一个元素
}
func main() {
arr := [5]int{1, 2, 3, 4, 5}
modifyArray(arr)
fmt.Println(arr) // 输出:[1 2 3 4 5],原数组没有改变
}
输出:
[1 2 3 4 5]
6. 数组与切片的区别
Go 中的切片(slice)与数组非常相似,但它是一个动态大小的数据结构,可以根据需要增长或缩小。而数组的大小在声明时就固定了,不可更改。
- 数组:固定大小,存储元素是值类型,传递时会复制数组。
- 切片:动态大小,灵活可变,传递时是引用类型,修改切片内容会影响原切片。
6.1 切片示例
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4] // 创建一个切片,包含 arr[1], arr[2], arr[3]
fmt.Println(slice) // 输出:[2 3 4]
7. 数组与切片的比较
| 特性 | 数组 | 切片 |
|---|---|---|
| 大小 | 固定大小 | 动态大小,可以增长或缩小 |
| 传递方式 | 值类型,传递时会复制整个数组 | 引用类型,传递的是引用 |
| 使用场景 | 当你知道元素的数量并且不会更改时 | 当元素数量动态变化时 |
8. 数组总结
- 数组是同类型元素的集合,大小是固定的。
- 数组是值类型,传递时会复制整个数组。
- Go 支持多维数组,数组的大小是固定的,不能更改。
- 数组的长度可以通过内置的
len()函数获得。 - 对于需要动态调整大小的数据结构,通常使用切片而非数组。