Go 语言中的数组详解
Go 语言中的数组是一种固定长度的、相同类型元素的集合。与切片(slice)不同,数组的长度是其类型的一部分,声明后无法改变。
基本语法
// 声明一个长度为5的整型数组
var arr [5]int
// 声明并初始化
var primes = [6]int{2, 3, 5, 7, 11, 13}
// [...]自动计算长度
days := [...]string{"Mon", "Tue", "Wed", "Thu", "Fri"}
主要特点
固定长度 - 数组长度在编译时确定,是类型的一部分
var a [3]int // [3]int类型 var b [5]int // [5]int类型 - a和b是不同的类型!
值类型 - 赋值或传递时会复制整个数组内容
a := [...]int{1, 2, 3} b := a // b是a的完整副本 b[0] = 9 // a不受影响,a[0]仍然是1
内存布局 - 元素在内存中连续存储
常用操作
访问和修改元素
arr := [3]string{"Go", "Python", "Java"}
// 访问第一个元素(索引从0开始)
first := arr[0]
// 修改第二个元素
arr[1] = "Rust"
遍历数组
colors := [4]string{"Red", "Green", "Blue", "Yellow"}
// for循环遍历
for i := 0; i < len(colors); i++ {
fmt.Println(colors[i])
}
// range方式遍历(推荐)
for index, value := range colors {
fmt.Printf("Index: %d, Value: %s\n", index, value)
}
多维数组
// 二维数组声明和初始化
var matrix [2][3]int = [2][3]int{
{1, 2, 3},
{4, 5, 6},
}
fmt.Println(matrix[1][2]) // =>6 (第二行第三列)
Go中更常用的替代方案:切片(Slice)
虽然Go有数组,但在实际开发中更常用的是切片(Slice),因为切片更灵活:
- 动态大小:可以增长和缩小(通过append等)
- 引用语义:传递时不复制底层数据
slice := []int{10,20} // slice不是array!
slice = append(slice,30) // slice可以扩展长度
Go中何时使用数组?
尽管不常用,但以下场景适合使用数组:
- 需要精确控制内存布局(如加密算法)
- 需要编译器保证固定大小
- 性能关键路径(避免切片的额外间接层)
Array vs Slice比较表
特性 | Array | Slice |
---|---|---|
长度 | 固定 | 可变 |
类型 | [n]T | []T |
传递方式 | 值传递(复制) | 引用传递 |
创建方式 | [n]T{}或[…]T{} | make([]T,len), []T{}, array[:], newSlice:=oldSlice[:end-start+1] |
常见用途 | 特殊需求、低级编程 | 日常开发 |
希望这个总结对你有帮助!对于大多数Go应用开发来说,掌握切片比深入了解数组更重要。
内容由零声教学AI助手提供,问题来源于学员提问