这里我们介绍下Go语言开发里面的切片。切片面向的使用对象是数组,它其实可以看做是数组的一个子集合的描述符,怎么理解这一句话呢?下面举个例子:
首先我们创建一个数组:
u := [10]byte{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
然后我们对这个数组进行切片,切片为一个新的数组引用,例如:
s := u[3:7]
这里的s其实就是一个切片,他的取值是从数组u里面获取下标为3到7之间的所有数,我们打印下s,看下效果:
可以看到s的值就是数组u的一个子集合,他也是一个数组。这就是切片。
关于切片的原理介绍下:
1、切片主要面向的对象是数组。
2、切片的元素内容可以看做是一个数组的子集。
3、切片只是一个数据的引用,并不存储数据,也就是上面s的值,其实还是从u里面获取的值,只有u才会分配内存地址,s只是使用指针引用u的值而已。
4、相对于上面第3点,有一个矛盾的地方,如果切面不是从原数组进行引用的,或者进行了动态扩容,那么切片会自动在底层创建数组进行引用.
额外扩展:
在go语言的切片数据结构里面,整个数据结构是这样的:
type slice struct { array unsafe.Pointer len int cap int }
我们看到每个切⽚包含以下三个字段。
array:指向下层数组某元素的指针,该元素也是切⽚的起始元
素。
len:切⽚的⻓度,即切⽚中当前元素的个数。
cap:切⽚的最⼤容量,cap >= len。
在日常创建切片的时候,记得才上cap参数,这样内存消耗等比较小。示例:
sl := make([ ] int, 0, ${cap})
还没有评论,来说两句吧...