Golang数组
- 1. 数组的声明
- 示例
- 2. 数组的初始化
- 初始化示例
- 3. 访问和修改数组元素
- 访问和修改元素的示例
- 4. 数组的遍历
- 遍历数组的示例
- 5. 多维数组
- 二维数组的示例
- 6. 数组是值类型
- 示例:数组的值传递
- 7. 数组与切片的区别
- 总结
在 Go 语言中,数组是一种固定长度的、元素类型一致的集合。它用于存储一定数量的相同类型数据,适用于数据量已知且不需要改变长度的场景。相比其他语言的数组,Go 语言的数组有一些特殊之处,比如 固定长度和 值类型。
1. 数组的声明
在 Go 中,数组声明需要指定数组的长度和元素的类型。数组的长度是固定的,不能动态改变。
var arr [5]int // 声明一个长度为 5 的整型数组,默认值是 0
在这个例子中,arr
是一个长度为 5 的整数数组,每个元素的默认值是 0
(对于整数类型)。其他类型的数组会有不同的默认值,如 float
的默认值为 0.0
,string
的默认值为 ""
(空字符串),bool
的默认值为 false
。
示例
我们可以通过不同方式声明数组:
var intArray [10]int // 10 个整型元素的数组
var stringArray [3]string // 3 个字符串元素的数组
var boolArray [4]bool // 4 个布尔值的数组
2. 数组的初始化
数组在声明时可以直接初始化值。可以在声明时为每个元素赋值,也可以使用 ...
让 Go 自动推断数组长度。
初始化示例
// 初始化方式一:直接指定元素
var arr1 = [5]int{1, 2, 3, 4, 5} // 长度为 5 的整数数组
fmt.Println(arr1) // 输出:[1 2 3 4 5]// 初始化方式二:让 Go 自动推断数组长度
var arr2 = [...]int{10, 20, 30} // 长度自动为 3
fmt.Println(arr2) // 输出:[10 20 30]// 初始化方式三:指定部分元素,未指定的元素使用默认值
arr3 := [5]int{1: 100, 3: 200} // 指定索引 1 和 3 的值
fmt.Println(arr3) // 输出:[0 100 0 200 0]
3. 访问和修改数组元素
数组元素可以通过索引访问。Go 语言的数组索引从 0
开始,到 长度 - 1
结束。我们可以使用索引来访问和修改数组的某个元素。
访问和修改元素的示例
arr := [5]int{1, 2, 3, 4, 5}fmt.Println(arr[0]) // 输出:1,访问第一个元素
arr[1] = 10 // 修改第二个元素的值
fmt.Println(arr) // 输出:[1 10 3 4 5]
注意:访问数组时,索引不能超出数组的范围,否则会导致运行时错误。
4. 数组的遍历
Go 语言提供了两种常用方法来遍历数组:
- 使用
for
循环 - 使用
range
关键字
遍历数组的示例
arr := [5]int{10, 20, 30, 40, 50}// 方法一:使用传统的 for 循环
for i := 0; i < len(arr); i++ {fmt.Println(arr[i])
}// 方法二:使用 range 遍历数组
for index, value := range arr {fmt.Printf("Index: %d, Value: %d\n", index, value)
}
使用 range
遍历数组时可以同时获取索引和元素的值,但如果不需要索引,可以使用 _
来省略它:
for _, value := range arr {fmt.Println(value)
}
5. 多维数组
Go 语言支持多维数组。常见的多维数组有二维数组。二维数组可以理解为“数组的数组”,在数据结构上形成一个矩阵。
二维数组的示例
var matrix [3][3]int // 声明一个 3x3 的二维数组// 初始化二维数组
matrix := [3][3]int{{1, 2, 3},{4, 5, 6},{7, 8, 9},
}// 访问二维数组元素
fmt.Println(matrix[0][1]) // 输出:2,访问第一行第二列的元素// 修改二维数组元素
matrix[1][1] = 100 // 将第二行第二列的元素改为 100
fmt.Println(matrix)
可以使用嵌套的 for
循环或者 range
语句来遍历多维数组:
for i := 0; i < len(matrix); i++ {for j := 0; j < len(matrix[i]); j++ {fmt.Print(matrix[i][j], " ")}fmt.Println()
}
6. 数组是值类型
在 Go 语言中,数组是值类型,这意味着当数组被赋值给另一个数组,或者传递给函数时,会复制整个数组的数据。这种特性与一些其他语言(如 C/C++)不同,那里数组是引用传递。
示例:数组的值传递
func modifyArray(arr [3]int) {arr[0] = 100
}arr := [3]int{1, 2, 3}
modifyArray(arr)
fmt.Println(arr) // 输出:[1 2 3],因为原数组未被修改
在这个例子中,modifyArray
函数接收到的是 arr
的副本,因此对副本的修改不会影响原数组。如果需要修改原数组,可以使用指针(*
)来传递数组的地址。
7. 数组与切片的区别
Go 语言中还有一种类似数组的数据结构叫切片(slice
)。切片与数组有以下区别:
- 长度是否固定:数组长度固定,而切片长度可以动态增长。
- 值传递 vs 引用传递:数组是值传递,复制时会创建新的副本;切片是引用传递,指向底层数组的相同位置。
- 推荐使用:Go 通常推荐使用切片,因为切片更灵活,适合处理动态长度的数据。
例如:
arr := [5]int{1, 2, 3, 4, 5} // 数组,长度固定
slice := arr[1:4] // 切片,从数组中切片,指向相同的底层数组
fmt.Println(slice) // 输出:[2 3 4]
总结
- 数组声明需要指定长度和元素类型,长度固定且不可更改。
- 数组初始化可以使用完整的值列表,或者让 Go 自动推断长度。
- 数组遍历可以用传统
for
循环或range
关键字。 - 多维数组是“数组的数组”,适用于矩阵类数据。
- 数组是值类型,赋值或传参会复制整个数组。
- 数组与切片的区别:数组是固定长度,切片可以动态扩展。