Go的Slice如何扩容 ?

Go中的切片(Slice)扩容是通过内建函数 append() 来完成的。当我们向切片中添加元素,并且切片的容量不足时,切片就会自动进行扩容。

切片的扩容规则如下:

  1. 如果切片的容量小于1000,那么扩容的时候就会直接翻倍,例如len=512,那么cap=1024

  2. 如果切片的容量大于等于1000,那么扩容的时候会增加25%,例如len=1024,那么cap=1280

扩容操作会创建一个新的底层数组,同时保持所有原始数据,然后返回这个新切片的引用。原始切片和新切片是完全独立的,修改任一切片的内容都不会影响另一个。

以下是一个使用 append() 对切片进行扩容的示例:

package main

import "fmt"

func main() {
    s := make([]int, 0, 1) // 创建一个初始容量为1的切片
    fmt.Printf("Initial capacity: %d\n", cap(s))

    for i := 1; i <= 20; i++ {
        s = append(s, i) // 向切片中添加元素
        fmt.Printf("Capacity after appending %d elements: %d\n", i, cap(s))
    }
}

在这个例子中,每次添加元素时,如果切片的容量不足,append() 就会自动扩大容量。

发表评论

后才能评论