最近看golang , 网上讲最多的是append扩容切片, 会以二倍增加容量, 经过测试证明在大多数情况下是以二倍增长, 但是有极少数情况并不是二倍增长 , 而是切片长度+1 增加容量
结论:
append 对切片扩容, 如果以二倍增加也存放不下的情况以len(slice) +1 扩容
测试代码
package main
import (
"fmt"
"math/rand"
"time"
)
// 获到一个随机长度切片
func getRandLengArr(max int) (slice []int) {
rand.Seed(time.Now().UnixNano())
arrLen := rand.Intn(max-1) + 1
for i := 0; i < arrLen; i++ {
slice = append(slice, rand.Intn(100))
}
return
}
// 测试append扩容特点
// 要多运行几次,会发现, 有极少数情况并不是以2倍的增长扩容
func main() {
slice := make([]int, 0, 0)
oldCap := cap(slice)
for i := 0; i < 10; i++ {
slice = append(slice, getRandLengArr(5)...)
if currCap := cap(slice); currCap > oldCap {
if oldCap == 0 {
fmt.Printf("currlen=%d oldcap->currcap:%d->%d 初次增长\n", len(slice), oldCap, currCap)
} else if currCap == len(slice)+1 {
fmt.Printf("currlen=%d oldcap->currcap:%d->%d 以len+1方式增长

本文通过测试探讨了Go语言中切片使用append方法进行扩容的特点,通常情况下扩容以二倍进行,但在特定情况下,扩容可能是切片长度加1。结论是,当二倍扩容不足以容纳新元素时,切片会按当前长度加1的方式扩容。
最低0.47元/天 解锁文章
1758

被折叠的 条评论
为什么被折叠?



