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)
这次源是一个string并copy()复制了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)的最小值.
我们在上面的例子中看到了这一点.
如果您需要了解有关切片的更多信息: