ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> > # 数组和切片的区别 - https://halfrost.com/go_slice/ - 大小和长度 - 数组具有固定的长度,它在声明时指定,并且不可更改 - 切片可以动态扩容 - 传递方式 - 数组的传递会拷贝一个副本, 修改其中一个值不会影响另一个(赋值和函数传参操作都会复制整个数组数据。) - 切片的传递不会拷贝副本, 指向的是同一个底层数组 - 内存分配 - **数组**:数组在声明时就会分配内存。无论是否使用,数组的内存都会被分配和占用。 - **切片**:切片是对数组的引用,只会在使用时分配内存,可以基于现有数组或切片生成新的切片。 - 切片是对数组的一种抽象,实际上是一个轻量级的数据结构,包括一个指向底层数组的指针、切片的长度和容量。切片本身的内存分配在声明时发生,但底层数组的内存分配只有在实际需要时才会分配。比如,当你用 `make` 函数创建一个切片时,Go 会分配底层数组所需的内存;如果你是从现有数组或切片创建一个新的切片(如使用 `arr[low:high]`),则不会分配新的内存,只是引用了原有的数组。 --- > # 切片 - 切片的结构体由3部分构成,Pointer 是指向一个数组的指针,len 代表当前切片的长度,cap 是当前切片的容量。cap 总是大于等于 len 的。 > # 扩容 - 如果当前切片的容量小于 1024,则新容量为当前容量的两倍。 - 如果当前切片的容量大于等于 1024,则新容量为当前容量的 1.25 倍 - 不完全对还要考虑内存对齐 > # 什么时候用数组什么时候用切片 - 数据量小, 固定长度的数组可以用数组 - `int[4]` 和 `int[5]` 不是同一个类型。它们被认为是不同的数组类型,其中 `[4]` 和 `[5]` 表示数组的长度,数组的长度是类型的一部分。因此,`int[4]` 和 `int[5]` 是两种不同的数组类型,它们不能互相赋值,也不能作为参数传递给接受不同长度数组的函数。 > # 相关阅读 - [3.2 切片](https://draveness.me/golang/docs/part2-foundation/ch03-datastructure/golang-array-and-slice/#32-%e5%88%87%e7%89%87)