复制功能如何工作?

Jas*_*hou -1 copy go slice

我不明白该copy功能如何根据文档工作:

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

func copy(dst, src []Type) int
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 12

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

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

签名:

func copy(dst, src []Type) int
Run Code Online (Sandbox Code Playgroud)

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

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

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)
Run Code Online (Sandbox Code Playgroud)

输出:

n = 5 src = [10 11 12 13 14] dst = [10 11 12 13 14]
Run Code Online (Sandbox Code Playgroud)

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

让我们继续这个例子:

dst = []int{0, 1}

n = copy(dst, src)
fmt.Println("n =", n, "src =", src, "dst =", dst)
Run Code Online (Sandbox Code Playgroud)

输出:

n = 2 src = [10 11 12 13 14] dst = [10 11]
Run Code Online (Sandbox Code Playgroud)

仅复制了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)
Run Code Online (Sandbox Code Playgroud)

输出:

n = 2 src = [10 11] dst = [10 11 2 3 4]
Run Code Online (Sandbox Code Playgroud)

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

因此,copy()只会复制与源或目标一样多的元素,以较小者为准.或者换句话说,尽管较小,但是"源"提供或目的地可以"容纳".

(作为一种特殊情况,它还会将字符串中的字节复制到一个字节片段.)

这意味着源也可以是stringif目的地是[]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)
Run Code Online (Sandbox Code Playgroud)

输出:

n = 5 str = Hello World! data = [72 101 108 108 111]
data as string: Hello
Run Code Online (Sandbox Code Playgroud)

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

源和目标可能重叠.

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

例如:

copy(src, src[1:])
fmt.Println("n =", n, "src =", src)
Run Code Online (Sandbox Code Playgroud)

输出:

n = 4 src = [1 2 3 4 4]
Run Code Online (Sandbox Code Playgroud)

这里我指定src[1:]为源,它是没有第一个元素的源(这是一个重新分析).由于我排除了第一个元素,因此源copy()有4个元素,因此4复制了元素.结果是元素被"移位"到少于1的索引(因此第一个元素0现在从切片中消失),并且未触及最后一个元素(因为仅复制了4个元素).

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

我们在上面的例子中看到了这一点.

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

去切片:用法和内部

数组,切片(和字符串):'追加'的机制