在Go语言中,数组和切片是两种重要的集合类型,它们的主要区别如下:
长度特性
数组的长度是固定的,在声明时必须指定且不可更改
goCopy Codevar arr [5]int // 固定长度为5的数组
切片的长度是动态的,可以根据需要自动扩容
goCopy Codevar slice []int // 动态切片,长度可变
内存分配
数组是值类型,赋值和传参时会复制整个数组
goCopy Codea := [3]int{1,2,3}
b := a // 完整复制数组a
切片是引用类型,包含指向底层数组的指针,赋值时共享底层数据
goCopy Codes1 := []int{1,2,3}
s2 := s1 // 共享底层数组
声明和初始化
数组声明必须指定长度:
goCopy Codevar arr1 [3]int
arr2 := [3]int{1, 2, 3}
切片声明无需指定长度,有多种创建方式:
goCopy Codevar slice1 []int
slice2 := make([]int, 3, 5) // 长度3,容量5
slice3 := []int{1, 2, 3}
容量机制
数组没有容量的概念,长度即容量
切片有长度和容量两个属性:
- 长度:当前元素个数
- 容量:底层数组从切片起始位置到末尾的元素个数
使用场景
数组适合元素数量固定的场景,如坐标、矩阵等
切片更常用,适合动态集合、函数参数传递等场景,是Go中处理集合数据的主要方式
理解这些区别有助于在合适场景选择正确的数据类型,提升代码效率和可维护性。