【go语言】copy使用注意事项

【go语言】copy使用注意事项

定义

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个元素。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值