slice 和 array的区别?(下级问题->slice底层与扩容机制)
- 数组的零值是元素类型的零值,切片的零值是 nil;
- 数组是固定长度,切片是可变长度;
- 数组是值类型,切片是引用类型。
slice的底层实现
slice 底层 是有 3 个字段的数据结构分为:
- array 数组
- len 长度
- cap 容量
指针指向数组的第一个该 slice 可访问的元素,这个元素并不一定是底层数组的第一个元素,长度是指 slice 中元素的个数,它不能超过 slice 的容量。
容量的大小通常是从 slice 底层数组的元素个数,什么意思呢举例:
arr:=[]int{1,2,3,4} slice:=arr[1:3] —(即:{2,3,4}) slice的长度为3 容量为4({1,2,3,4}为底层数组)
Go 的内置函数 len 和 cap 用来返回 slice 的长度和容量。
slice扩容机制
容量1024前 每次扩容2倍,之后扩容1.25倍,一直到超过元素数量或者相等位置。
所以对于数量太大的切片来说,扩容很耗性能,因为每次扩容,切片都会重新分配内存空间,并将原切片的值复制给新切片,原切片被垃圾回收。
如果知道容量的话,一开始指定生成大容量切片较好。使用make语句
[]byte{}和 string 的区别(深层次问题->数组与切片的区别)
string是不可变的字节序列,[]byte{}是可变的字节序列,简单地说string是字节数组,[]byte{}是字节切片
string为UTF-8编码 这导致len不一定是字符串中的个数 而是字节数