如何在 go 中为 slices 实现复制功能?

How is copy function implemented for slices in go?

提问人:Ebenezer Rahul 提问时间:9/23/2023 最后编辑:Ebenezer Rahul 更新时间:9/25/2023 访问量:83

问:

我想了解 go 的复制函数如何用于切片

package main

import "fmt"

func main() {

    arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    copy(arr[4:], arr[2:])

    fmt.Println(arr)
}

我表示输出为 [1, 2, 3, 4, 3, 4, 3, 4, 3, 3, 4]

但它是 [1, 2, 3, 4, 3, 4, 5, 6, 7, 8]

我想知道它(即复制)是如何实现的??

切片

评论

2赞 rocka2q 9/23/2023
阅读 Go 编程语言规范:追加和复制切片
0赞 Volker 9/23/2023
当您想了解它是如何工作的时,实现是无关紧要的。这就是关于“抽象”的整个想法:你不需要知道内部的内脏是如何连接的,就可以理解整体工作。

答:

2赞 Burak Serdar 9/23/2023 #1

copy将字节复制到目标。如果区域重叠,则可以向后工作以避免重新复制已复制的部分。在您的情况下,它将从源的最后一个元素开始向后复制。在其他情况下,它可能会继续复制。min(len(source), len(target))copy

0赞 nimdrak 9/23/2023 #2

我认为这些东西可以帮助你

  1. 复印功能如何工作?

  2. copy()的评论

// The copy built-in function copies elements from a source slice into a
// destination slice. (As a special case, it also will copy bytes from a
// string to a slice of bytes.) The source and destination may overlap. Copy
// returns the number of elements copied, which will be the minimum of
// len(src) and len(dst).
func copy(dst, src []Type) int

如果 src 和 dst 重叠。copy(arr[4:], arr[2:])

所以,min (len(arr[4:]), len(arr[2:])) 是 7。

从第 2 个元素(从零开始的索引)开始的 7 个元素被复制到第 4 个和第 9 个元素之间。3, 4, 5, 6, 7, 8

所以结果是[1, 2, 3, 4, 3, 4 , 5, 6, 7, 8]

如果你想知道它的实现,你可以找到运行时源目录的 memmove 文件,这些文件是用 Assembly 编写的。(Golang 的内置函数实现)

评论

1赞 unifreak 11/16/2023
不知道为什么这样切中要害和信息丰富的答案会被否决。
0赞 Jiuqu 9/25/2023 #3
  1. arr[2:]=[3, 4, 5, 6, 7, 8, 9, 10];
  2. arr[4:]=[5, 6, 7, 8, 9, 10];
  3. 然后复制函数 do: copy [3, 4, 5, 6, 7, 8] into [5, 6, 7, 8, 9, 10],所以得到 arr[4:]=[3, 4, 5, 6, 7, 8],and arr[:4]=[1, 2, 3, 4], 所以结果是 arr=[1, 2, 3, 4, 3, 4 , 5, 6, 7, 8]