ZetCode

Golang copy 函数

最后修改时间 2025 年 5 月 8 日

本教程将解释如何在 Go 中使用内置的 copy 函数。我们将通过实际示例介绍高效数据复制的切片复制基础知识。

copy 函数将元素从源切片复制到目标切片。它返回复制的元素数量,该数量是源切片和目标切片长度中的较小值。

在 Go 中,copy 用于在切片或数组之间高效地传输数据。它能正确处理重叠的切片,并且比手动循环复制数据更高效。

基本切片复制示例

copy 最简单的用法是在两个切片之间传输数据。此示例演示了基本的切片复制。
注意:目标切片必须具有足够的容量。

basic_copy.go
package main

import "fmt"

func main() {
    src := []int{1, 2, 3, 4, 5}
    dst := make([]int, len(src))
    
    n := copy(dst, src)
    
    fmt.Println("Copied", n, "elements")
    fmt.Println("Source:", src)
    fmt.Println("Destination:", dst)
}

copy 函数将 src 中的所有元素复制到 dst。返回的值 n 等于 src 的长度,因为 dst 的长度相同。

部分切片复制

我们可以通过使用切片表达式仅复制切片的一部分。此示例显示了切片之间的部分复制。

partial_copy.go
package main

import "fmt"

func main() {
    src := []string{"apple", "banana", "cherry", "date", "elderberry"}
    dst := make([]string, 3)
    
    n := copy(dst, src[1:4])
    
    fmt.Println("Copied", n, "elements")
    fmt.Println("Source:", src)
    fmt.Println("Destination:", dst)
}

代码将 src 中索引 1 到 3 的元素复制到 dst。由于 dst 的长度为 3,因此只复制了 3 个元素。

不同类型之间的复制

如果不同类型的底层类型相同,则 copy 函数可以在它们之间工作。此示例演示了在字节和 uint8 切片之间的复制。

type_copy.go
package main

import "fmt"

func main() {
    src := []byte{'G', 'o', 'l', 'a', 'n', 'g'}
    dst := make([]uint8, len(src))
    
    n := copy(dst, src)
    
    fmt.Println("Copied", n, "elements")
    fmt.Printf("Source: %v\n", src)
    fmt.Printf("Destination: %v\n", dst)
}

字节和 uint8 在 Go 中是相同的类型,因此 copy 可以在它们之间工作。该函数成功复制了所有元素。

带有重叠切片的复制

copy 函数可以正确处理重叠的切片。此示例展示了如何使用 copy 在单个切片内移动元素。

overlap_copy.go
package main

import "fmt"

func main() {
    data := []int{1, 2, 3, 4, 5, 6, 7, 8}
    
    // Shift elements left by 2 positions
    n := copy(data, data[2:])
    
    // Truncate the slice
    data = data[:n]
    
    fmt.Println("Copied", n, "elements")
    fmt.Println("Result:", data)
}

copy 操作在同一切片内将元素向左移动。最终切片被截断以移除末尾剩余的元素。

从数组复制到切片

copy 函数可以将数据从数组复制到切片。此示例演示了从固定大小的数组复制到切片。

array_copy.go
package main

import "fmt"

func main() {
    src := [5]int{10, 20, 30, 40, 50}
    dst := make([]int, 3)
    
    n := copy(dst, src[:])
    
    fmt.Println("Copied", n, "elements")
    fmt.Println("Source array:", src)
    fmt.Println("Destination slice:", dst)
}

在复制之前,使用 [:] 操作符将数组转换为切片。由于 dst 的长度为 3,因此只复制了 3 个元素。

来源

Go 语言规范

本教程通过将数据高效地复制到切片和数组中的实际示例,介绍了 Go 中的 copy 函数。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程