golang中数组和切片的区别


在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中处理集合数据的主要方式

理解这些区别有助于在合适场景选择正确的数据类型,提升代码效率和可维护性。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注