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

URL: https://caijiao.org/go/02-composite/03-slice-append-copy
Source: docs/go/02-composite/03-slice-append-copy.md
Description: 本节介绍 Go 语言中切片的 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` 和容量机制，有助于高效使用切片和优化性能。
