我正在创建一个处理数组管理的Java库.Go中是否有等效的Arrays.copyOfRange?
一个简单的单线程(省略索引检查):
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.
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |