Go之切片
Posted louis181214
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go之切片相关的知识,希望对你有一定的参考价值。
在Golang中数组定义后长度不可变,但很多时候我们需要数组能够动态赋值,这个时候就可以用到slice切片来解决这个问题。
一:切片的介绍
①:切片是数组的一个引用,因此切片是引用类型数据;
②:切片的使用方法基本和数组一样;
③:也可以理解切片为动态的数组(虽然和数组有本质的区别);
④:切片的语法定义 var slice []int
二:切片的原理
切片与指针在内存的布局类型,不同的是切片在内存分成了三部分,如下图所示第一块存的是数组的第一个元素的内存地址,第二块是切片的长度,第三块是切片的容积。
三:切片的定义/声明方法
①:引用一个已经创建好的数组
备注:第九行的arr[:3]表示从第0个元素切到第三三个元素即 0=<切片<3。后面再详细讲解。
②:使用meke函数来创建切片
备注:右下图可知推到可知,切片如果不指定值,将会根据切片的数据类型指定默认值。
③:定义切片的同时直接指定数组
备注:①与②③方式的区别①直接引用定义好的数组,对程序员而言是可见的,而②③由于切片实在内存底层维护,所依程序员不可见(结合第二大类理解)。
四:切片使用细节
①:切片赋值范围注意点 var slice = arr[0:arr[end]],将不会包含arr数组的最后一个元素,需要 arr[0:len(arr)]才能完全赋值给slice;
②:[start:end]的使用细节,[0:end]可简写为[:end]或[0:]或[:],其他的细节使用一样;
③:可以通过cap()函数统计切片的最容量,举例略。
④:切片定义后还需要引用数组或make后才能使用。
⑤:append函数对切片进行动态追加(该过程将在内存创建并引用新的数组空间)
备注:append()函数如果最佳的是具体的数值如slice = append(slice, 10)则不需要...;由下图可知append后,slice引用了新的内存数组地址。
⑥:切片的copy
备注:切片的copy需要注意的点是,接受复制的切片必须先定义好或已经拥有内存数组空间。
⑦:字符串亦可以赋值给切片,过程与数组一致,举例略。
以上是关于Go之切片的主要内容,如果未能解决你的问题,请参考以下文章