Go语言数组完全指南
概述
数组是Go语言中最基础的数据结构之一,它代表一段固定长度的连续内存空间,用于存储相同类型的元素序列。与切片(slice)不同的是,数组的长度在编译时就已确定,无法动态改变。在Go程序中,数组常用于需要精确控制内存分配或保证数据完整性的场景,如底层算法实现、硬件交互等。
数组与切片的主要区别
特性 | 数组 | 切片 |
---|---|---|
长度 | 固定 | 可变 |
类型 | 值类型 | 引用类型 |
传递方式 | 完全拷贝 | 传递描述符 |
内存分配 | 栈或静态存储 | 堆分配 |
大小确定时机 | 编译时 | 运行时 |
性能特点 | 访问更快 | 操作更灵活 |
初始化 | 必须指定长度 | 可以动态创建 |
数组的定义与声明
Go语言中数组的声明方式多样,主要有以下几种形式:
// 1. 基本声明方式(未初始化,元素为零值)
var arr1 [3]int // 声明长度为3的整型数组,初始值[0 0 0]// 2. 短变量声明并初始化
arr2 := [3]int{1, 2, 3} // 显式初始化,值为[1 2 3]// 3. 使用...让编译器推断长度
arr3 := [...]int{4, 5, 6, 7} // 编译器自动计算长度为4,值为[4 5 6 7]// 4. 指定索引初始化(稀疏数组)
arr4 := [5]int{1: 10, 3: 30} // 只初始化索引1和3,其余为0,值为[0 10 0 30 0]// 5. 混合初始化(带索引和自动推断)
arr5 := [...]string{0: "Go", 2: "Python", 1: "Java"} // 值为["Go" "Java" "Python"]
数组的特性
固定长度
数组长度是其类型的一部分,这意味着[3]int和[5]int是完全不同的类型,不能相互赋值或比较:
var x [3]int
var y [5]int
x = y // 编译错误:cannot use y (type [5]int) as type [3]int in assignmentfunc process(data [3]int) { /*...*/ }
data := [5]int{1,2,3,4,5}
process(data) // 编译错误:参数类型不匹配
值语义
数组是值类型,赋值或传递时会产生完整拷贝:
a := [2]int{1, 2}
b := a // 创建数组a的完整副本
b[0] = 3