Go 语言中数组和切片有什么区别?
Go 语言中数组和切片有什么区别?
提示
题眼: 切片的底层是数组
在 Go 语言中,数组和切片都可以存储一组数据,但它们的语义和使用方式差别很大:
- 定义方式不同:数组定义为
var arr [N]T,长度是类型的一部分;切片定义为var s []T。 - 长度和容量不同:数组长度固定;切片有长度和容量,且容量可以随着扩容变化。
- 传递方式不同:数组是值类型,传参时会复制整个数组;切片传递的是切片头部的副本,底层仍可能共享同一块数组。
- 使用场景不同:数组更适合固定长度场景;切片更灵活,也是实际开发中最常用的数据结构之一。
重要
参考答案:
数组和切片都是用来存储一组数据的。数组是值类型,切片通常表现为引用语义,切片本质上是对底层数组的一层封装。
切片底层可以理解成三个核心字段:指向底层数组的指针、len 和 cap。len 表示当前有多少元素,cap 表示到底层数组末尾为止还能容纳多少元素。
开发中更常用的是切片,因为它比数组灵活。数组长度固定,定义时是多少后面基本就不能改;切片则支持动态扩容。当切片容量不够时,运行时会分配更大的底层数组,再把旧数据拷贝过去。
