数组是Go语言中最基本的数据结构之一,它是一组相同类型元素的固定长度序列。
数组的基本特性
1、固定长度:数组的长度在声明时确定,不可改变。
2、相同类型:所有元素必须是同一类型。
3、连续内存:元素在内存中是连续存储的。
4、值类型:数组是值类型,赋值或传参会复制整个数组。
数组的声明和初始化
// 声明一个包含5个int的数组,初始化为零值
// 零值初始化
var a [5]int
// 字面量初始化
var b = [3]int{1, 2, 3}
c := [4]string{"a", "b", "c", "d"}
// 使用...让编译器计算数组长度 长度为5
// 索引初始化
e := [...]int{1, 2, 3, 4, 5}
// 指定索引位置初始化,未指定的为零值
// 自动长度推断初始化
d := [5]int{1: 10, 3: 30}
// 结果为 [0, 10, 0, 30, 0]
数组元素的访问和操作
arr := [3]int{10, 20, 30}
// 通过索引访问
first := arr[0] // 10
second := arr[1] // 20
// 修改元素
arr[2] = 40
数组遍历
方法1:
使用for循环索引遍历
// 使用for循环
for i := 0; i < len(arr); i++ {
fmt.Println(arr[i])
}
方法2:
使用range关键字遍历
arr := [5]string{"Apple", "Banana", "Orange", "Grape", "Pear"}
// range遍历,获取索引和值
for index, value := range arr {
fmt.Printf("索引:%d 值:%s\n", index, value)
}
// 只需要值时
for _, value := range arr {
fmt.Println("值:", value)
}
// 只需要索引时
for index := range arr {
fmt.Println("索引:", index)
}
多维数组
二维数组的声明和初始化:
// 声明二维数组
var matrix [3][3]int
// 初始化二维数组
matrix = [3][3]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
// 访问元素
val := matrix[1][2] // 6
数组的长度和容量
数组的长度是固定的,可以使用内置函数len()获取:
arr := [5]int{1, 2, 3, 4, 5}
length := len(arr) // 5
数组作为函数参数
数组是值类型,作为函数参数时会复制整个数组:
func modifyArray(arr [3]int) {
arr[0] = 100
}
func main() {
a := [3]int{1, 2, 3}
modifyArray(a)
fmt.Println(a) // 输出 [1 2 3],原数组未改变
}
如果需要修改原数组,可以使用指针:
func modifyArray(arr *[3]int) {
arr[0] = 100
}
func main() {
a := [3]int{1, 2, 3}
modifyArray(&a)
fmt.Println(a) // 输出 [100 2 3]
}
数组与切片的区别
特性 | 数组 | 切片 |
---|---|---|
长度 | 固定 | 动态可变 |
类型 | 值类型 | 引用类型 |
声明方式 | [n]T | []T |
内存分配 | 栈或静态存储区 | 堆 |
传递效率 | 低(复制整个数组) | 高(只复制切片头) |
大小 | 编译时确定 | 运行时动态变化 |
注意
1、长度固定,无法动态扩展。
2、作为值类型传递时会有性能开销(特别是大数组)。
3、缺乏灵活性。