切片 copy
在 Go 语言中,copy 函数是一个内置函数,用于将一个切片(slice)的元素复制到另一个切片中。它的用法和行为非常简单,但有一些细节需要注意。让我详细解释一下。
copy 函数的定义
func copy(dst, src []T) int
- 参数:
dst:目标切片(destination),元素会被复制到这里。src:源切片(source),元素从这里复制。T:表示切片的元素类型(可以是任意类型,例如int、string等)。
- 返回值:返回实际复制的元素个数(
int类型)。
工作原理
copy会将src中的元素复制到dst中:- 复制从索引 0 开始,按照顺序覆盖
dst中的元素。 - 如果
dst的长度(len)小于src的长度,只有dst能容纳的部分会被复制。 - 如果
src的长度小于dst的长度,只有src的元素会被复制,dst剩余部分保持不变。
- 复制从索引 0 开始,按照顺序覆盖
- 返回值为复制的元素个数:
- 实际复制的元素个数是
len(dst)和len(src)中的较小值。
- 实际复制的元素个数是
- 不会改变切片的长度或容量:
copy只操作已有元素,不会扩展或缩减dst的长度(len)或容量(cap)。
示例代码
示例 1:基本用法
package main
import "fmt"
func main() {
src := []int{1, 2, 3}
dst := make([]int, 2) // 长度为 2 的目标切片
n := copy(dst, src)
fmt.Println("dst:", dst) // 输出: dst: [1 2]
fmt.Println("复制的元素个数:", n) // 输出: 复制的元素个数: 2
}
- 解释:
src的长度是 3,包含[1, 2, 3]。dst的长度是 2,只能容纳 2 个元素。copy将src的前 2 个元素[1, 2]复制到dst,返回 2。
示例 2:dst 比 src 长
package main
import "fmt"
func main() {
src := []int{1, 2}
dst := []int{0, 0, 0} // 长度为 3 的目标切片
n := copy(dst, src)
fmt.Println("dst:", dst) // 输出: dst: [1 2 0]
fmt.Println("复制的元素个数:", n) // 输出: 复制的元素个数: 2
}
- 解释:
src的长度是 2,包含[1, 2]。dst的长度是 3,包含[0, 0, 0]。copy将src的[1, 2]复制到dst的前 2 个位置,第三个元素0不变。- 返回值为 2,因为只复制了 2 个元素。
示例 3:复制到自身
package main
import "fmt"
func main() {
s := []int{0, 1, 2, 3, 4}
n := copy(s[1:], s[:4]) // 将 s[0:4] 复制到 s[1:]
fmt.Println("s:", s) // 输出: s: [0 0 1 2 3]
fmt.Println("复制的元素个数:", n) // 输出: 复制的元素个数: 4
}
- 解释:
s[:4]是[0, 1, 2, 3],长度为 4。s[1:]是[1, 2, 3, 4],长度为 4。copy(s[1:], s[:4])将[0, 1, 2, 3]复制到s[1:],覆盖原来内容。- 结果
s变为[0, 0, 1, 2, 3]。
注意事项
- 长度限制:
copy只复制两者长度的较小值。例如:src := []int{1, 2, 3} dst := make([]int, 1) n := copy(dst, src) // 只复制 1 个元素 fmt.Println(dst) // [1] fmt.Println(n) // 1
- 容量无关:
copy不关心dst或src的容量(cap),只关心长度(len)。- 如果需要更大的
dst,可以用make创建足够长度的切片。
- 类型匹配:
dst和src的元素类型必须相同,否则编译会报错。
- 空切片:
- 如果
src是空切片(长度为 0),则不会复制任何元素:src := []int{} dst := []int{1, 2, 3} n := copy(dst, src) fmt.Println(dst) // [1 2 3](不变) fmt.Println(n) // 0
- 如果
常见用途
- 复制数据:避免修改原始切片时影响其他引用。
- 移动数据:通过操作切片索引实现数据的移动(如示例 3)。
- 初始化切片:从一个切片快速填充另一个切片。
总结
copy(dst, src)将src的元素复制到dst,返回复制的元素个数。- 复制数量取决于
len(dst)和len(src)的较小值。 - 不会改变切片的长度或容量,只覆盖已有元素。
如果你有具体的 copy 使用场景或疑问,可以告诉我,我会进一步帮你分析!

浙公网安备 33010602011771号