提问人:Ebenezer Rahul 提问时间:9/23/2023 最后编辑:Ebenezer Rahul 更新时间:9/25/2023 访问量:83
如何在 go 中为 slices 实现复制功能?
How is copy function implemented for slices in go?
问:
我想了解 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赞
Burak Serdar
9/23/2023
#1
copy
将字节复制到目标。如果区域重叠,则可以向后工作以避免重新复制已复制的部分。在您的情况下,它将从源的最后一个元素开始向后复制。在其他情况下,它可能会继续复制。min(len(source), len(target))
copy
0赞
nimdrak
9/23/2023
#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
- arr[2:]=[3, 4, 5, 6, 7, 8, 9, 10];
- arr[4:]=[5, 6, 7, 8, 9, 10];
- 然后复制函数 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]
评论