0%

go语言基础5--切片与数组相关

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不一定是字符串中的个数 而是字节数

-------------本文结束感谢您的阅读-------------
打赏一瓶矿泉水