在 Go 语言中,数组(array)是一种固定长度的、具有相同类型元素的序列。数组的长度是数组类型的一部分,因此不同长度的数组被认为是不同的类型。数组在 Go 中是一个值类型,这意味着当数组被赋值或传递时,会复制整个数组的内容。
数组的定义
数组的定义语法如下:
var arrayName [length]Type
arrayName
是数组的名称。length
是数组的长度,必须是常量。Type
是数组中元素的类型。
例如:
var arr [5]int // 定义一个长度为5的int类型数组
数组的初始化
- 默认初始化:
数组的元素会被初始化为其类型的零值。var arr [5]int fmt.Println(arr) // 输出: [0 0 0 0 0]
- 使用数组字面量初始化:
arr := [5]int{1, 2, 3, 4, 5} fmt.Println(arr) // 输出: [1 2 3 4 5]
- 部分初始化:
可以只初始化数组的一部分,未初始化的元素会被设置为零值。arr := [5]int{1, 2} fmt.Println(arr) // 输出: [1 2 0 0 0]
- 使用
...
自动推断长度:
如果使用...
代替数组长度,Go 会根据初始化的元素数量自动推断数组长度。arr := [...]int{1, 2, 3, 4, 5} fmt.Println(arr) // 输出: [1 2 3 4 5]
数组的访问和修改
- 访问数组元素:
使用下标访问数组元素,下标从0
开始。arr := [5]int{1, 2, 3, 4, 5} fmt.Println(arr[2]) // 输出: 3
- 修改数组元素:
可以通过下标修改数组元素。arr := [5]int{1, 2, 3, 4, 5} arr[2] = 10 fmt.Println(arr) // 输出: [1 2 10 4 5]
数组的长度
使用 len
函数可以获取数组的长度。
arr := [5]int{1, 2, 3, 4, 5} fmt.Println(len(arr)) // 输出: 5
数组的遍历
- 使用
for
循环遍历:arr := [5]int{1, 2, 3, 4, 5} for i := 0; i < len(arr); i++ { fmt.Println(arr[i]) }
- 使用
range
关键字遍历:arr := [5]int{1, 2, 3, 4, 5} for index, value := range arr { fmt.Printf("arr[%d] = %d\n", index, value) }
数组是值类型
数组在 Go 中是值类型,这意味着当数组被赋值或传递时,会复制整个数组的内容。
arr1 := [3]int{1, 2, 3} arr2 := arr1 // arr2 是 arr1 的副本 arr2[0] = 10 fmt.Println(arr1) // 输出: [1 2 3] fmt.Println(arr2) // 输出: [10 2 3]
多维数组
Go 支持多维数组,例如二维数组:
var arr [2][3]int // 定义一个2行3列的二维数组 arr = [2][3]int{ {1, 2, 3}, {4, 5, 6}, } fmt.Println(arr) // 输出: [[1 2 3] [4 5 6]]
数组的局限性
- 数组的长度是固定的,无法动态调整。
- 数组是值类型,传递大数组时会有性能开销。
总结
数组是 Go 语言中的一种基本数据结构,适用于需要固定长度序列的场景。由于数组的长度是类型的一部分,因此在需要动态调整长度时,通常会使用切片(slice)来代替数组。理解数组的特性和局限性对于编写高效的 Go 代码非常重要。