开发Java数组管理库,Go语言是否有Java Arrays.copyOfRange等效实现?
Go语言中与Java
Arrays.copyOfRange 等效的实现方案 嘿,刚好我对这个点挺熟悉的!Go语言里确实有和Java Arrays.copyOfRange 功能完全等效的实现,而且用法还挺灵活,我给你拆解下具体的实现方式:
核心实现思路
Java的Arrays.copyOfRange本质是复制原数组/集合指定索引范围的元素,返回一个独立的新数组,Go语言里可以通过切片的特性来实现这个需求,主要有两种常用方式:
方式一:copy 函数 + 切片截取
这种方式逻辑清晰,适合需要明确控制新切片创建的场景:
package main import "fmt" func main() { // 原切片(如果是数组的话,先转成切片:arr[:]) src := []int{1, 2, 3, 4, 5} // 要复制的范围:[start, end),对应Java的from和to start, end := 1, 4 // 创建一个长度等于目标范围长度的新切片 dst := make([]int, end - start) // 复制指定范围的元素到新切片 copy(dst, src[start:end]) fmt.Println(dst) // 输出:[2 3 4] // 修改原切片不会影响新切片,说明是独立的复制 src[2] = 100 fmt.Println(dst) // 依然输出:[2 3 4] }
方式二:append 函数简化写法
如果想要更简洁的代码,可以利用append的特性——当追加的元素超过切片容量时,Go会自动分配新的底层数组,从而实现独立复制:
package main import "fmt" func main() { src := []int{1, 2, 3, 4, 5} start, end := 1, 4 // 用空切片作为起点,追加指定范围的元素,得到独立的新切片 dst := append([]int(nil), src[start:end]...) fmt.Println(dst) // 输出:[2 3 4] src[2] = 100 fmt.Println(dst) // 依然输出:[2 3 4] }
注意事项
- 切片截取的语法是
slice[low:high],遵循左闭右开规则,和JavaArrays.copyOfRange的from(包含)、to(不包含)完全一致; - 如果原数据是Go的数组(而非切片),需要先将数组转换为切片(比如
arr[:])再进行操作; - 当
start等于end时,会返回空切片;如果start超过原切片长度或者end大于原切片长度,会触发panic,这和Java的ArrayIndexOutOfBoundsException行为一致。
内容的提问来源于stack exchange,提问作者Alvin Reyes
相关产品推荐
相关产品推荐

