主题
append、copy、切片容量与扩容原理
切片是动态数组,支持自动扩容,append
和 copy
是常用操作函数。
1. append 函数
append
用于向切片添加元素,可能导致底层数组扩容:
go
s := []int{1, 2, 3}
s = append(s, 4, 5)
如果容量不足,Go 会自动分配更大的数组并复制原数据。
2. copy 函数
copy
用于复制切片数据:
go
src := []int{1, 2, 3}
dst := make([]int, 2)
n := copy(dst, src) // 复制 n 个元素
fmt.Println(dst) // [1 2]
copy
会复制最小长度的数据。
3. 切片容量与扩容
cap(s)
返回切片容量,决定可存储多少元素而无需扩容。- 当
append
添加元素超过容量时,底层数组会扩容,通常扩容为原容量的两倍。
示例观察容量变化:
go
var s []int
for i := 0; i < 10; i++ {
s = append(s, i)
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
理解 append
、copy
和容量机制,有助于高效使用切片和优化性能。