slice如何扩容
时间: 2023-06-29 15:06:18 浏览: 43
在 Go 中,slice 的长度可以通过 append 函数进行扩容。当 slice 的容量不足以容纳新添加的元素时,append 函数会自动分配一块更大的内存,并将原有元素复制到新的内存空间中,然后再添加新元素。
下面是一个例子,演示了如何使用 append 函数扩容 slice:
```
package main
import "fmt"
func main() {
s := []int{1, 2, 3}
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) // len=3 cap=3 [1 2 3]
s = append(s, 4)
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) // len=4 cap=6 [1 2 3 4]
s = append(s, 5, 6, 7)
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) // len=7 cap=12 [1 2 3 4 5 6 7]
}
```
在第一次调用 append 函数时,由于 slice 容量足够,所以直接在原有内存空间中添加新元素,slice 的容量仍然为 3。但是在第二次调用 append 函数时,由于新添加的元素超出了 slice 的容量,因此系统会自动分配一块更大的内存,并将原有元素复制到新的内存空间中,然后再添加新元素,slice 的容量变为 6。同理,在第三次调用 append 函数时,slice 的容量会变为 12。
需要注意的是,每次扩容都会导致原有元素的复制,因此不要过度依赖 slice 的自动扩容功能,以免影响程序性能。如果预计 slice 中元素数量较大,可以在创建 slice 时就指定一个较大的容量,以减少扩容的次数。