go语言的切片,go语言切片扩容
Golang|切片原理
在Golang语言开发过程中,我们经常会用到数组和切片数据结构,数组是固定长度的,而切片是可以扩张的数组,那么切片底层到底有什么不同?接下来我们来详细分析一下内部实现。
创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于网站建设、网站制作、游仙网络推广、小程序制作、游仙网络营销、游仙企业策划、游仙品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供游仙建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
首先我们来看一下数据结构
这里的array其实是指向切片管理的内存块首地址,而len就是切片的实际使用大小,cap就是切片的容量。
我们可以通过下面的代码输出slice:
这么分析下来,我们可以了解如下内容:
使用一个切片通常有两种方法:
另一种是slice = make([]int, len, cap)这种方法,称为分配内存。
创建一个slice,实质上是在分配内存。
这里跟一下细节,math.MulUintptr是基于底层的指针计算乘法的,这样计算不会导致超出int大小,这个方法在后面会经常用到。
同样,对于int64的长度,也有对应的方法
而实际分配内存的操作调用mallocgc这个分配内存的函数,这个函数以后再分析。
我们了解切片和数组最大的不同就是切片能够自动扩容,接下来看看切片是如何扩容的
这里可以看到,growslice是返回了一个新的slice,也就是说如果发生了扩容,会发生拷贝。
所以我们在使用过程中,如果预先知道容量,可以预先分配好容量再使用,能提高运行效率。
copy这个函数在内部实现为slicecopy
还有关于字符串的拷贝
这里显示了可以把string拷贝成[]byte,不能把[]byte拷贝成string。
1、切片的数据结构是 array内存地址,len长度,cap容量
2、make的时候需要注意 容量 * 长度 分配的内存大小要小于264,并且要小于可分配的内存量,同时长度不能大于容量。
3、内存增长的过程:
4、当发生内存扩容时,会发生拷贝数据的现象,影响程序运行的效率,如果可以,要先分配好指定的容量
5、关于拷贝,可以把string拷贝成[]byte,不能把[]byte拷贝成string。
go语言中实现切片(slice)的三种方式
定义一个切片,然后让切片去引用一个已经创建好的数组。基本语法如下:
索引1:切片引用的起始元素位
索引2:切片只引用该元素位之前的元素
例程如下:
在该方法中,我们未指定容量cap,这里的值为5是系统定义的。
在方法一中,可以用arr数组名来操控数组中的元素,也可以通过slice切片来操控数组中的元素。切片是直接引用数组,数组是事先存在的,程序员是可见的。
通过 make 来创建切片,基本语法如下:
make函数第三个参数cap即容量是可选的,如果一定要自己注明的话,要注意保证cap≥len。
用该方法可以 指定切片的大小(len)和容量(cap)
例程如下:
由于未赋值系统默认将元素值置为0,即:
数值类型数组: 默认值为 0
字符串数组: 默认值为 ""
bool数组: 默认值为 false
在方法二中,通过make方式创建的切片对应的数组是由make底层维护,对外不可见,即只能通过slice去访问各个元素。
定义一个切片,直接就指定具体数组,使用原理类似于make的方式。
例程如下:
Go语言 排序与搜索切片
Go语言标准库中提供了sort包对整型,浮点型,字符串型切片进行排序,检查一个切片是否排好序,使用二分法搜索函数在一个有序切片中搜索一个元素等功能。
关于sort包内的函数说明与使用,请查看
在这里简单讲几个sort包中常用的函数
在Go语言中,对字符串的排序都是按照字节排序,也就是说在对字符串排序时是区分大小写的。
二分搜索算法
Go语言中提供了一个使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比较㏒₂n个元素,其中n为切片中元素的总数。
sort.Search(size,fn)函数接受两个参数:所处理的切片的长度和一个将目标元素与有序切片的元素相比较的函数,该函数是一个闭包,如果该有序切片是升序排列,那么在判断时使用 有序切片的元素 = 目标元素。该函数返回一个int值,表示与目标元素相同的切片元素的索引。
在切片中查找出某个与目标字符串相同的元素索引
当前文章:go语言的切片,go语言切片扩容
链接地址:http://myzitong.com/article/hcjjcp.html