什么相当于Go中的Java Arrays.copyOfRange?

时间:2018-01-30 12:49:29

标签: java arrays go

我正致力于创建一个处理数组管理的Java库。 Go中是否有等效的Arrays.copyOfRange

1 个答案:

答案 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的支持数组。

相关问题