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 中的 copy
函数。