内容简介:分以下几种情况:1.切片每次新增个数不超过原来的1倍,且每次增加数不超过1024个,且增加后总长度小于1024个,这种情况下扩容后为原来的2倍2.切片一次新增个数超过原来1倍,但不超过1024个,且增加后总长度小于1024个,这种情况下扩容后比实际具有的总长度还要大一些。
golang 切片扩容的探讨
分以下几种情况:
1.切片每次新增个数不超过原来的1倍,且每次增加数不超过1024个,且增加后总长度小于1024个,这种情况下扩容后为原来的2倍
s1 := make([]int, 0) fmt.Printf("The capacity of s1: %d\n", cap(s1)) for i := 1; i <= 17; i++ { s1 = append(s1, i) fmt.Printf("s1(%d): len: %d, cap: %d\n", i, len(s1), cap(s1)) } fmt.Println()
结果: /* The capacity of s1: 0 s1(1): len: 1, cap: 1 s1(2): len: 2, cap: 2 s1(3): len: 3, cap: 4 s1(4): len: 4, cap: 4 s1(5): len: 5, cap: 8 s1(6): len: 6, cap: 8 s1(7): len: 7, cap: 8 s1(8): len: 8, cap: 8 s1(9): len: 9, cap: 16 s1(10): len: 10, cap: 16 s1(11): len: 11, cap: 16 s1(12): len: 12, cap: 16 s1(13): len: 13, cap: 16 s1(14): len: 14, cap: 16 s1(15): len: 15, cap: 16 s1(16): len: 16, cap: 16 s1(17): len: 17, cap: 32 */
2.切片一次新增个数超过原来1倍,但不超过1024个,且增加后总长度小于1024个,这种情况下扩容后比实际具有的总长度还要大一些。
s2 := make([]int, 10) fmt.Printf("The capacity of s2: %d\n", cap(s2)) r1 := append(s2, make([]int, 5)...) fmt.Printf("r1: len: %d, cap: %d\n", len(r1), cap(r1)) r2 := append(s2, make([]int, 11)...) fmt.Printf("r2: len: %d, cap: %d\n", len(r2), cap(r2)) r3 := append(s2, make([]int, 21)...) fmt.Printf("r3: len: %d, cap: %d\n", len(r3), cap(r3)) fmt.Printf("注意:像r2,r3 一次增加个数超过原容量的1倍,增加后结果比实际总长度预想的稍大一点 \n") fmt.Println()
结果: /* The capacity of s2: 10 r1: len: 15, cap: 20 r2: len: 21, cap: 22 r3: len: 31, cap: 32 注意:像r2,r3 一次增加个数超过原容量的1倍,增加后结果比实际总长度预想的稍大一点 */
3.原切片长度超过1024时,一次增加容量不是2倍而是0.25倍,每次超过预定的都是0.25累乘
// 1024 * 0.25 = 256 s3 := make([]int, 1024) fmt.Printf("The capacity of s3: %d\n", cap(s3)) r4 := append(s3, make([]int, 200)...) fmt.Printf("r4: len: %d, cap: %d\n", len(r4), cap(r4)) r5 := append(s3, make([]int, 256)...) fmt.Printf("r5: len: %d, cap: %d\n", len(r5), cap(r5)) // 1280 * 0.25 = 320 r6 := append(s3, make([]int, 266)...) fmt.Printf("r6: len: %d, cap: %d\n", len(r6), cap(r6)) fmt.Printf("注意:像r6 一次增加个数超过原容量的0.25倍,增加后结果比原容量1.25倍预想的稍大一点 \n") fmt.Println()
结果: /* The capacity of s3: 1024 r4: len: 1224, cap: 1280 r5: len: 1280, cap: 1280 r6: len: 1290, cap: 1696 注意:像r6 一次增加个数超过原容量的0.25倍,增加后结果比原容量1.25倍预想的稍大一点 */
说明下:第三种情况,又分为两种,一种是原长度不小于1024时,一次扩容后为原来的1.25倍(当然一次增加的个数不超过原长度的0.25倍);第二种情况就是一次增加个数超过原长度的0.25倍,扩容后其容量比预想的总长度稍大点,就比如 r6: len: 1290, cap: 1696, 一次扩容长度大于0.25倍,扩容后,其实际容量比0.25累乘预想的大一点,比如1024 1.25 1.25 = 1600 ,实际为1696.
示例代码保存在GitHub地址: 点击
以上所述就是小编给大家介绍的《golang 切片扩容的探讨》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 一文读懂区块链链上扩容和链下扩容
- golang内存扩容
- Sharding扩容方案-2(实现)
- VirtualBox 虚拟机磁盘扩容
- VirtualBox中Ubuntu扩容
- Hashmap源码解析-扩容函数
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript经典实例
Shelley Powers / 李强 / 中国电力出版社 / 2012-3 / 78.00元
《JavaScript经典实例》各节中的完整代码解决了常见的编程问题,并且给出了在任何浏览器中构建Web应用程序的技术。只需要将这些代码示例复制并粘贴到你自己的项目中就行了,可以快速完成工作,并且在此过程中学习JavaScript的很多知识。你还将学习如何利用ECMAScript5和HTML5中的最新功能,包括新的跨域挂件通信技术、HTML5的video和audio元素,以及绘制画布。《JavaS......一起来看看 《JavaScript经典实例》 这本书的介绍吧!