我正致力于创建一个处理数组管理的Java库。 Go中是否有等效的Arrays.copyOfRange
答案 0 :(得分:5)
简单的单行代码(省略索引检查):
func copyOfRange(src []byte, from, to int) []byte {
return append([]byte(nil), src[from:to]...)
}
一个简单的slice expression“几乎”完成了这项工作,但由于Java的Arrays.copyOfRange()
返回一个独立于源的副本,我们需要将切片结果复制到一个新的切片(因为切片的结果)将共享支持数组。)
我们可以通过使用make()
分配一个,并使用内置copy()
,或者只使用append()
将其附加到空或nil
切片,将负责分配和复制。
使用上述功能的例子:
src := []byte{0, 1, 2, 3, 4, 5}
dst := copyOfRange(src, 2, 4)
fmt.Println(dst)
输出(在Go Playground上尝试):
[2 3]
为了完整起见,这就是make()
和copy()
的样子:
func copyOfRange2(src []byte, from, to int) []byte {
src = src[from:to]
dst := make([]byte, len(src))
copy(dst, src)
return dst
}
有一点需要注意:内置append()
分配的空间超出了需求,考虑了未来的增长。因此,如果您不打算“增长”返回的切片,copyOfRange2()
是更好的选择。
见这个比较:
dst := copyOfRange(src, 2, 4)
fmt.Println(dst, cap(dst))
dst = copyOfRange2(src, 2, 4)
fmt.Println(dst, cap(dst))
输出(在Go Playground上尝试):
[2 3] 8
[2 3] 2
如您所见,append()
(在copyOfRange()
内)分配了一个大小为8
的支持数组,而在我们copyOfRange2()
中我们明确分配了一个切片(和大小为2
的支持数组。