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 函数。