在go中如何实现切片的复制功能?

4sup72z8  于 2023-09-28  发布在  Go
关注(0)|答案(3)|浏览(130)

我想了解go的copy函数是如何为切片工作的

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,4]**
但它是**[1,2,3,4,3,4,5,6,7,8]**
我想知道它是如何(即)。#21453;,是否实施??

mrwjdhj3

mrwjdhj31#

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

gopyfrb3

gopyfrb32#

  1. arr[2:]=[3,4,5,6,7,8,9,10];
  2. arr[4:]=[5,6,7,8,9,10];
    1.然后复制函数do:将[3,4,5,6,7,8]复制到[5,6,7,8,9,10]中,因此您得到<$[4:]=[3,4,5,6,7,8],并且<$[:4]=[1,2,3,4],因此结果是<$=[1,2,3,4,3,4,5,6,7,8]
ukdjmx9f

ukdjmx9f3#

我想这些东西可以帮助你

  1. How does the copy function work?
  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

copy(arr[4:], arr[2:])情况下,src和dst重叠。
所以min(len(arr[4:]),len(arr[2:]))是7。
从第2个元素开始的7个元素(基于零的索引3, 4, 5, 6, 7, 8)被复制到第4个和第9个之间。
所以结果是[1, 2, 3, 4, 3, 4 , 5, 6, 7, 8]
如果你想知道它的实现,你可以找到运行时源目录的memmove文件,这些文件是用Assembly编写的。(Golang's builtin function implementations

相关问题