复制功能如何工作? [关闭]

2024-02-12

我不明白如何copy函数基于文档工作:

copy 内置函数将元素从源切片复制到 目标切片。 (作为一种特殊情况,它还会从 字符串到字节切片。)源和目标可能重叠。复制 返回复制的元素数量,这将是以下元素中的最小值 len(src) 和 len(dst)。

func copy(dst, src []Type) int

该规范还涵盖了内置函数append() and copy(): 追加和复制切片 https://golang.org/ref/spec#Appending_and_copying_slices。你应该阅读它;很清楚。

我们来分析一下内置的文档copy() https://golang.org/pkg/builtin/#copy函数及其使用以及简单的示例。您可以尝试上面的所有示例去游乐场 https://go.dev/play/p/elXbEIkYJ8A.

签名:

func copy(dst, src []Type) int

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

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

copy()将从中复制元素src切片成dst slice.

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)

Output:

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

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

我们继续这个例子:

dst = []int{0, 1}

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

Output:

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

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

继续:

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

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

Output:

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

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

So copy()只会复制与源或目标相同数量的元素,以较小者为准。或者换句话说,源“提供”或目的地可以“容纳”尽可能多的数据,以较小者为准。

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

这意味着源也可以是string如果目的地是[]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)

Output:

n = 5 str = Hello, World! data = [72 101 108 108 111]
data as string: Hello

这次的来源是string and copy()复制了五个字节UTF-8 https://en.wikipedia.org/wiki/UTF-8的代表string(这就是 Go 在内存中存储字符串的方式)。

源和目的地可能重叠。

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

例如:

copy(src, src[1:])
fmt.Println("n =", n, "src =", src)

Output:

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

这里我指定了src[1:]作为源,这是没有第一个元素的源(这是一个重新切片 https://golang.org/ref/spec#Slice_expressions)。由于我排除了第一个元素,因此copy()有四个元素,所以4元素被复制。结果是元素被“移动”到一个小于 1 的索引(因此第一个元素是0现在已经从切片中消失了),并且最后一个元素没有被触及(因为只复制了四个元素)。

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

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

如果您需要了解有关切片的更多信息:

Go Slices:用法和内部结构 https://blog.golang.org/go-slices-usage-and-internals

数组、切片(和字符串):“追加”的机制 https://blog.golang.org/slices

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复制功能如何工作? [关闭] 的相关文章

随机推荐