【Go Slice详解】读者纷纷表示终于理解了Cap

网站建设4年前发布
12 0 0

打印结果:,202303061310311634e1514fd894a588c09269a90c30a696cbc0413,解析: 说明我们已经声明成功了,但是并没有开辟内存空间,因为s1、s2的值为nil,我们可以在声明的同时初始化,打印结果:,2023030613103208020e51369fe89852f407be256f61debc2c89328,解析:初始化成功,s1 s2的值都不等于nil,分别使用len()、cap()获得切片的长度和容量,打印结果:,20230306131033e37888203ac938520d5916df82c28abd2b64c8330,解析:和我们预期的一致,长度和容量都为3,开篇我已经提到数组和切片的关系,这里再进一步讲一下:,打印结果:,2023030613103405acb8459315ea39a6d9171088ba5ac98510e7361,注意:a1[0:4] 基于一个数组切割  [0:4]左包含 右不包含  即为[1,2,3,4],打印结果:,20230306131034113058987625ba6930a82875f887adc4fab6f6947,解析:都符合上面提到的​​左包含,右不包含​​原则 s4从下标2开始截取,截取到下标4 s5省略了第一个参数,表示从下标0开始截取 s6省略了第二个参数,表示截取到最后一个元素 s7省略了两个参数,只填写了中间的冒号:,表示取全部元素,切片的长度很好理解,就是元素的个数。,切片的容量我们重点理解一下:在切片引用的底层数组中从切片的第一个元素到数组最后一个元素的长度就是切片的容量,我来画个图:,20230306131035f5e1730137a9208324029282eec5302daca26c244,我们看下面这个栗子就很好理解啦:,打印结果:,2023030613141134af06592153c50beb0055ce556484d123bda6442,解析:a1是数组长度为9,容量也为9,值是从1~9,s5/s6/s7都是切割数组a1得到的切片。,s5的长度为4,因为只有1 2 3 4这4个元素,容量为9,因为s5切片是从数组起始位置开始切割的:第一个元素是1,而s5底层数组a1最后一个元素是9,1~9共9个元素,所以s5的容量为9。,s6的长度为7,因为s6的元素是3-9这7个元素;容量也为7,因为s5的底层数组最后一个元素是9,3-9共7个元素,所以s6的容量为7。,S7更好理解了,长度和容量都是9,小伙伴们自己理解一下。,我们可以对切片进行再切片操作,比如,我们针对上面的数据再次切片进行测试,打印结果:,2023030613103683a116152f883c4d0cc7597a3d51a676f10d09821,解析:我们知道可以对切片进行再次切片就可以,至于长度和容器大家搞明白上面的栗子,这个输出结果就是意料之中的了。,我们举个栗子来证明切片是引用类型,打印结果:,20230306131036b65fb19961520bedaeb16626a87486d685ebbc121,解析:由此我们可以明确的知道切片是引用类型,当底层数组改变时,不管是切片,还是切片再切片,值都会改变。因为他们使用的是一个内存块,引用的一个内存地址。,这篇文章介绍了切片的特点,如何定义切片,如果由数组切割切片,切片的引用类型特征。,本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。,20230306131037e7cb01d233051e244890715b2c56abbfd5ed19431,转载本文请联系「 程序员升级打怪之旅」公众号。

© 版权声明

相关文章