为了账号安全,请及时绑定邮箱和手机立即绑定

复制功能如何工作?

复制功能如何工作?

Go
犯罪嫌疑人X 2021-11-08 16:02:58
copy根据文档,我不明白该函数是如何工作的:copy 内置函数将元素从源切片复制到目标切片。(作为一种特殊情况,它还会将字节从字符串复制到字节切片。)源和目标可能重叠。Copy 返回复制的元素数,这将是 len(src) 和 len(dst) 中的最小值。func copy(dst, src []Type) int
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

该规范还涵盖了内置函数append()和copy():附加到和复制切片。你应该阅读它,它很清楚。


让我们copy()通过简单的例子来分析内置函数的文档及其用法。您可以尝试Go Playground上的所有示例。


签名:


func copy(dst, src []Type) int

copy()是一个函数,它有 2 个参数,一个目标切片和一个源切片,其元素类型相同。它返回一个类型int数,即实际复制的元素数。


copy 内置函数将元素从源切片复制到目标切片。


copy()将src切片中的元素复制到dst切片中。


src := []int{10, 11, 12, 13, 14}

dst := []int{0, 1, 2, 3, 4}


n := copy(dst, src)

fmt.Println("n =", n, "src =", src, "dst =", dst)

输出:


n = 5 src = [10 11 12 13 14] dst = [10 11 12 13 14]

它复制了所有 5 个元素,复制后目标与源具有相同的元素。


让我们继续这个例子:


dst = []int{0, 1}


n = copy(dst, src)

fmt.Println("n =", n, "src =", src, "dst =", dst)

输出:


n = 2 src = [10 11 12 13 14] dst = [10 11]

只复制了 2 个元素,因为目标只有 2 个元素。


继续:


src = []int{10, 11}

dst = []int{0, 1, 2, 3, 4}


n = copy(dst, src)

fmt.Println("n =", n, "src =", src, "dst =", dst)

输出:


n = 2 src = [10 11] dst = [10 11 2 3 4]

同样,只复制了 2 个元素,但这次是因为源只有 2 个元素。


所以copy()只会复制与源或目标一样多的元素,以较小者为准。或者换句话说,源“提供”或目的地可以“容纳”多少,以较小者为准。


(作为一种特殊情况,它还会将字节从字符串复制到字节切片。)


这意味着源也可以是 a stringif destination is a []byte:


str := "Hello World!"

data := make([]byte, 5)

n = copy(data, str)

fmt.Println("n =", n, "str =", str, "data =", data)

fmt.Printf("data as string: %s\n", data)

输出:


n = 5 str = Hello World! data = [72 101 108 108 111]

data as string: Hello

这次的源是 astring并copy()复制了 UTF-8 表示的 5 个字节string(这就是 Go 在内存中存储字符串的方式)。


源和目的地可能重叠。


这意味着copy()即使目标是一个与源切片共享相同底层数组的切片,并且源和目标指定的数组部分具有公共部分(重叠),它也能正常工作。


例如:


copy(src, src[1:])

fmt.Println("n =", n, "src =", src)

输出:


n = 4 src = [1 2 3 4 4]

这里我指定src[1:]为源,也就是没有第一个元素的源(这是一个重新切片)。由于我排除了第一个元素,源copy()有 4 个元素,所以4元素被复制。结果是元素被“移动”到一个小于 1 的索引(因此第一个元素0现在从切片中消失了),而最后一个元素没有被触及(因为只复制了 4 个元素)。


Copy 返回复制的元素数,这将是 len(src) 和 len(dst) 中的最小值。


我们在上面的例子中已经看到了这一点。


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信