我想了解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;,是否实施??
3条答案
按热度按时间mrwjdhj31#
copy
将min(len(source), len(target))
字节复制到目标。如果区域重叠,则copy
可以反向工作以避免重新复制已经复制的部分。在您的示例中,它将从源代码的最后一个元素开始反向复制。在其他情况下,它可能会继续复制。gopyfrb32#
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]
ukdjmx9f3#
我想这些东西可以帮助你
在
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)