定义
Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。
内存不重叠拷贝
package main
import "fmt"
func main() {
src := make([] int, 0, 10)
for i := 0; i < 10; i++{
src = append(src, i)
}
dst := make([] int, 0, 10)
copy(dst, src)
fmt.Println("src: ", src)
fmt.Println("dst: ", dst)
}
输出
src: [0 1 2 3 4 5 6 7 8 9]
dst: []
再次看一下定义,copy会按照其中较小的那个数组切片的元素个数进行复制,其中dst的元素个数为0,因此拷贝个数为0(尽管dst的容量为10)。
package main
import "fmt"
func main() {
src := make([] int, 0, 10)
for i := 0; i < 10; i++{
src = append(src, i)
}
dst := make([] int, len(src))//这里将长度定义为src的长度
copy(dst, src)
fmt.Println("src: ", src)
fmt.Println("dst: ", dst)
for i := 0; i < 10; i++{
dst[i] *= 2
}
fmt.Println("src: ", src)
fmt.Println("dst: ", dst)
}
}
输出
src: [0 1 2 3 4 5 6 7 8 9]
dst: [0 1 2 3 4 5 6 7 8 9]//拷贝成功
src: [0 1 2 3 4 5 6 7 8 9]
dst: [0 2 4 6 8 10 12 14 16 18]//结果互不影响
内存重叠拷贝
package main
import "fmt"
func main() {
src := make([] int, 0, 10)
for i := 0; i < 10; i++{
src = append(src, i)
}
fmt.Println(src)
copy(src[5:], src)
fmt.Println(src)
}
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 0 1 2 3 4]
因为目的切片src[5 : ]的长度为5,src长度为10,只拷贝5个元素,将src的前5个元素0 1 2 3 4 拷贝到src[5 : ]这个切片,也就是后5个元素。