Golang数组切片区别
新手学习Golang时对数组和切片的区别不太理解,想请教几个问题:
- 数组和切片在内存结构上有什么本质区别?
- 为什么切片比数组更常用?
- 切片作为函数参数传递时会发生什么?是值传递还是引用传递?
- 数组和切片在扩容机制上有什么不同?
最好能用实际代码例子说明下它们的区别和使用场景,感谢!
2 回复
Golang中,数组是固定长度的值类型,切片是动态长度的引用类型。数组赋值会复制整个数据,切片赋值共享底层数组。切片更灵活,常用作函数参数。
更多关于Golang数组切片区别的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在 Go 语言中,数组和切片是两种不同的数据结构,主要区别如下:
1. 长度固定性
- 数组:长度固定,声明时必须指定长度(例如
[3]int),无法动态改变。 - 切片:长度可变,基于数组或直接创建,支持动态扩容(例如
[]int)。
2. 声明与初始化
- 数组:
var arr [3]int // 声明长度为3的数组,初始值为0 arr := [3]int{1,2,3} // 初始化赋值 - 切片:
var s []int // 声明为nil切片 s := []int{1,2,3} // 初始化 s := make([]int, 3) // 使用make创建,长度3,容量3
3. 底层关系
- 切片是对数组的抽象,包含三个字段:
- 指针:指向底层数组的起始元素。
- 长度(len):当前元素个数。
- 容量(cap):从起始位置到底层数组末尾的元素数。
4. 传递方式
- 数组是值类型,赋值或传参时会复制整个数组。
- 切片是引用类型,传递时复制切片头(指针、长度、容量),但共享底层数组。
5. 扩容机制
- 切片可调用
append()动态添加元素。容量不足时,会创建新底层数组并拷贝数据(通常按2倍容量扩容)。
示例代码
// 数组
arr := [3]int{1, 2, 3}
// 切片
slice := []int{1, 2, 3}
slice = append(slice, 4) // 动态扩展
// 从数组创建切片
subSlice := arr[1:3] // 引用arr的部分数据
总结
- 需要固定大小时用数组,需动态调整时用切片。
- 切片更灵活,是 Go 中常用的集合类型。

