我想从一个数组创建多个切片。每片一片,缺少一个元素。我正在使用此代码 (playground):
nums := []int{1,2,3}
for i := 0; i < len(nums); i++ {
fmt.Println(append(nums[:i], nums[i+1:]...))
}
我期待收到
[2 3]
[1 3]
[1 2]
但我收到了
[2 3]
[2 3]
[2 3]
这是为什么?
答案 0 :(得分:1)
非常感谢您向我指出这一点。这是我目前的解决方案。它只是复制我正在处理的数组 (playground)
package main
import (
"fmt"
)
func main() {
nums := []int{1,2,3}
for i := 0; i < len(nums); i++ {
cpy := make([]int, len(nums))
copy(cpy, nums)
fmt.Println(append(cpy[:i], cpy[i+1:]...))
}
}
答案 1 :(得分:1)
As mkopriva correctly pointed out,您的程序的输出与您预期的不同,因为 append
产生的所有切片共享相同的底层数组。您需要以某种方式将这些切片与切片 nums
的底层数组分离。
一种可行的方法确实是使用 copy
,就像您在 your answer 中所做的那样。还有一个更简洁的替代方案,尽管对于未经训练的眼睛来说可能不会更清晰。
您可以使用 copy
(full-slice expression,又名 三索引切片)作为 {{1} 的第一个参数,而不是使用 nums[:i:i]
}}:
append
生成的切片将与切片 nums := []int{1,2,3}
for i := 0; i < len(nums); i++ {
fmt.Println(append(nums[:i:i], nums[i+1:]...))
}
的底层数组分离,您将获得所需的输出:
nums