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

Alv*_*yes 0 java arrays go

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

icz*_*cza 5

一个简单的单线程(省略索引检查):

func copyOfRange(src []byte, from, to int) []byte {
    return append([]byte(nil), src[from:to]...)
}
Run Code Online (Sandbox Code Playgroud)

一个简单的切片表达式 "几乎"完成了这项工作,但由于Java Arrays.copyOfRange()返回一个独立于源的副本,我们需要将切片结果复制到一个新切片(因为切片的结果将共享支持数组).

我们可以通过分配一个make(),并使用内置copy(),或者只是append()用来将它附加到空或nil切片,这将负责分配和复制.

使用上述功能的示例:

src := []byte{0, 1, 2, 3, 4, 5}
dst := copyOfRange(src, 2, 4)
fmt.Println(dst)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

[2 3]
Run Code Online (Sandbox Code Playgroud)

为了完整性,这就是它的外观make()copy():

func copyOfRange2(src []byte, from, to int) []byte {
    src = src[from:to]
    dst := make([]byte, len(src))
    copy(dst, src)
    return dst
}
Run Code Online (Sandbox Code Playgroud)

有一点需要注意:内置append()分配的空间超出了需求,考虑了未来的增长.因此,如果您不打算"增长"返回的切片,那么这copyOfRange2()是一个更好的选择.

看到这个比较:

dst := copyOfRange(src, 2, 4)
fmt.Println(dst, cap(dst))

dst = copyOfRange2(src, 2, 4)
fmt.Println(dst, cap(dst))
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

[2 3] 8
[2 3] 2
Run Code Online (Sandbox Code Playgroud)

如您所见,append()(内部copyOfRange())分配了一个大小为的支持数组8,而在我们中copyOfRange2()我们明确地分配了一个大小的切片(和支持数组)2.