slice介绍
数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。在初始定义数组时,我们并不知道需要多大的数组,因此我们就需要“动态数组”。在Go里面这种数据结构叫slice,slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明也可以像array一样,只是不需要长度,它是可变长的,可以随时往slice里面加数据。
初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量:
1.一个指向原生数组的指针(point):指向数组中slice指定的开始位置;
2.数组切片中的元素个数(len):即slice的长度;
3.数组切片已分配的存储空间(cap):也就是slice开始位置到数组的最后位置的长度。
从底层实现的角度来看,数组切片实际上仍然使用数组来管理元素,基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且可以被随意传递而不会导致所管理的元素被重复复制。
slice声明
声明slice时方括号[]内没有任何数据
声明一个元素类型为int的slice
var mySlice []int 声明两个元素类型为byte的slice
golang 中的 slice 非常强大,让数组操作非常方便高效。在开发中不定长度表示的数组全部都是 slice 。但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果就是在实际开发中碰到很多坑,以至于出现一些莫名奇妙的问题,数组中的数据丢失了。
下面我们就开始详细理解下 slice ,理解后会对开发出高效的程序非常有帮助。
这个是 slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。
其中 len 和 cap 就是我们在调用 len(slice) 和 cap(slice) 返回的值。
我们来按照 slice 的数据结构定义来解析出 ptr, len, cap
// 按照上图定义的数据结构 type Slice struct { ptr unsafe.Pointer // Array pointer len int // slice length cap int // slice capacity }
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。