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之切片的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#愚公系列2022年08月 Go教学课程 021-Go容器之切片操作

7Go语言基础之切片(slice)

带你了解Go语言基础之切片

从零开始学Go之容器:切片

Go 语言泛型编程之切片

Go语言基础之切片