如何在Go语言中对切片排序且不修改原切片?
如何在Go语言中对切片排序且不修改原切片?
嘿,这个问题我之前也踩过坑!咱们先搞清楚你代码里出问题的原因,再给出靠谱的解决方案。
为什么原切片会被修改?
在Go里,切片本质上是个包含底层数组指针、长度、容量的结构体。当你写:
newArray := originalArray
这步并没有创建新的底层数组,newArray和originalArray共享同一个数组空间。所以调用sort.Ints(newArray)时,其实是在修改这个共享的底层数组,原切片自然也就跟着变了。
正确的实现方法
要实现排序不影响原切片,核心是先创建原切片的独立副本(也就是新的底层数组),再对副本排序。这里有两种常用的简单方法:
方法1:使用copy函数创建副本
import ( "fmt" "sort" ) func main() { originalArray := []int{4, 2, 1, 1, 2} // 创建一个和原切片长度一致的新切片 newArray := make([]int, len(originalArray)) // 将原切片元素复制到新切片(会生成新的底层数组) copy(newArray, originalArray) // 对新切片排序 sort.Ints(newArray) fmt.Printf("原切片: %v\n", originalArray) // 输出 [4 2 1 1 2] fmt.Printf("排序后的新切片: %v\n", newArray) // 输出 [1 1 2 2 4] }
方法2:用append快速生成副本
这是更简洁的写法,通过向空切片追加原切片的所有元素来创建独立副本:
import ( "fmt" "sort" ) func main() { originalArray := []int{4, 2, 1, 1, 2} // 用append生成原切片的独立副本,底层数组完全独立 newArray := append([]int(nil), originalArray...) sort.Ints(newArray) fmt.Printf("原切片: %v\n", originalArray) // 输出 [4 2 1 1 2] fmt.Printf("排序后的新切片: %v\n", newArray) // 输出 [1 1 2 2 4] }
两种方法都能确保排序操作只作用于新的底层数组,完全不会改动原切片的值。
内容的提问来源于stack exchange,提问作者Kevin Amiranoff
相关产品推荐
相关产品推荐

