java - Go 中的 Java Arrays.copyOfRange 等价于什么?

标签 java arrays go

我正在致力于创建一个处理数组管理的 Java 库。 Go 中有 Arrays.copyOfRange 的等价物吗?

最佳答案

一个简单的单行代码(省略索引检查):

func copyOfRange(src []byte, from, to int) []byte {
    return append([]byte(nil), src[from:to]...)
}

一个简单的slice expression “几乎”完成了工作,但是由于 Java 的 Arrays.copyOfRange() 返回一个独立于源的副本,我们需要将 slice 结果复制到一个新的 slice (因为 slice 的结果将共享后备阵列)。

我们可以通过分配一个 make() 来做到这一点, 并使用内置 copy() , 或者简单地使用 append()将其附加到空或 nil slice ,这将负责分配和复制。

使用上述函数的例子:

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
}

这里要注意一件事:考虑到 future 的增长,内置的 append() 分配了比需要更多的空间。因此,如果您不打算“增长”返回的 slice ,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 的 slice (和支持数组)。

关于java - Go 中的 Java Arrays.copyOfRange 等价于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48521909/

相关文章:

Javascript - 在Group-by之后将一个数组转换为两个数组

go - 从 Go 中的自定义类型(指针片段)中删除元素

reflection - Go 反射(reflect)字段索引 - 单个索引与 slice

go - 运行输出时间太长

java - JVM 如何读取系统属性?

javax.naming.NoIntialContextException : for JNDI DataSource

java - 使用 ImageView 显示图库

java - 使用 apache Camel 执行路由关闭逻辑

C 中的重复项计数

javascript - float和int之和返回不寻常的小数位js