Golang中的数组是固定长度的同类型元素集合,长度在声明时就确定,后续无法修改,这是它和切片最明显的区别。数组在内存中是连续存储的,访问效率很高,适合存储数量固定的同类型数据。

Golang数组的声明
数组的声明需要指定元素类型和数组长度,语法格式为 var 数组名 [长度]元素类型,声明后数组的每个元素会被初始化为对应类型的零值。
常见的声明方式有以下几种:
- 声明指定长度的整型数组,元素默认值为0
- 声明指定长度的字符串数组,元素默认值为空字符串
- 声明指定长度的布尔数组,元素默认值为false
下面是具体的声明代码示例:
package main
import "fmt"
func main() {
// 声明长度为5的整型数组,默认元素都是0
var intArr [5]int
// 声明长度为3的字符串数组,默认元素都是空字符串
var strArr [3]string
// 声明长度为2的布尔数组,默认元素都是false
var boolArr [2]bool
fmt.Println("整型数组默认值:", intArr)
fmt.Println("字符串数组默认值:", strArr)
fmt.Println("布尔数组默认值:", boolArr)
}
Golang数组的初始化
数组可以在声明的同时完成初始化,也可以先声明后赋值,初始化方式比较灵活,主要有以下几种:
1. 声明时直接赋值初始化
在声明数组时,直接在后面跟上初始化列表,给对应位置的元素赋值,未赋值的元素保持零值。
package main
import "fmt"
func main() {
// 声明长度为4的整型数组,前两个元素赋值,后两个保持默认值0
var arr1 [4]int = [4]int{1, 2}
fmt.Println("arr1的值:", arr1) // 输出 [1 2 0 0]
}
2. 使用省略号自动推导长度初始化
如果初始化时已经给出了所有元素的值,可以使用省略号 ... 代替长度,编译器会自动根据初始化元素的个数推导数组长度。
package main
import "fmt"
func main() {
// 使用省略号自动推导长度,数组长度为3
arr2 := [...]int{10, 20, 30}
fmt.Println("arr2的长度:", len(arr2)) // 输出 3
fmt.Println("arr2的值:", arr2) // 输出 [10 20 30]
}
3. 指定索引位置初始化
可以只给数组中指定索引的元素赋值,其他未指定的索引位置元素保持零值,索引从0开始。
package main
import "fmt"
func main() {
// 只给索引0和索引2的位置赋值,索引1和3保持默认值0
arr3 := [4]int{0: 5, 2: 15}
fmt.Println("arr3的值:", arr3) // 输出 [5 0 15 0]
}
访问Golang数组元素
数组元素通过索引访问,索引范围是0到数组长度减1,访问方式分为单个元素访问和遍历访问两种。
1. 单个元素访问与修改
通过 数组名[索引] 的方式可以获取对应位置的元素值,也可以给该位置赋值修改元素。
package main
import "fmt"
func main() {
arr := [...]int{1, 2, 3, 4}
// 访问索引1的元素
fmt.Println("索引1的元素:", arr[1]) // 输出 2
// 修改索引2的元素
arr[2] = 10
fmt.Println("修改后的数组:", arr) // 输出 [1 2 10 4]
}
2. 遍历数组元素
遍历数组可以使用传统的for循环配合索引,也可以使用for range循环,for range循环会同时返回索引和对应元素值。
package main
import "fmt"
func main() {
arr := [...]string{"Go", "Python", "Java", "C++"}
fmt.Println("使用传统for循环遍历:")
for i := 0; i < len(arr); i++ {
fmt.Printf("索引%d: %sn", i, arr[i])
}
fmt.Println("使用for range循环遍历:")
for index, value := range arr {
fmt.Printf("索引%d: %sn", index, value)
}
// 如果不需要索引,可以用下划线忽略
fmt.Println("忽略索引遍历:")
for _, value := range arr {
fmt.Println("元素值:", value)
}
}
注意事项
- 数组的长度是数组类型的一部分,
[3]int和[4]int是不同的类型,不能直接赋值 - 访问数组时如果索引超出范围,会触发运行时 panic,需要保证索引在合法范围内
- 数组是值类型,赋值或者传参时会复制整个数组,修改副本不会影响原数组
数组适合存储固定长度的同类型数据,如果需要在运行时动态调整长度,应该选择Golang的切片类型。