append、copy、切片容量与扩容原理

切片是动态数组,支持自动扩容,appendcopy 是常用操作函数。

1. append 函数

append 用于向切片添加元素,可能导致底层数组扩容:

s := []int{1, 2, 3}
s = append(s, 4, 5)

`

如果容量不足,Go 会自动分配更大的数组并复制原数据。

2. copy 函数

copy 用于复制切片数据:

src := []int{1, 2, 3}
dst := make([]int, 2)
n := copy(dst, src)  // 复制 n 个元素
fmt.Println(dst)     // [1 2]

copy 会复制最小长度的数据。

3. 切片容量与扩容

  • cap(s) 返回切片容量,决定可存储多少元素而无需扩容。
  • append 添加元素超过容量时,底层数组会扩容,通常扩容为原容量的两倍。

示例观察容量变化:

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)
}

理解 appendcopy 和容量机制,有助于高效使用切片和优化性能。