我只是展示代码,非常简单,go play:
package main
import (
"fmt"
)
func main() {
a := []int{1,2,3,4,5,6}
for i:=0 ; i < len(a); i++ {
b := append(a[:i], a[i+1:]...)
fmt.Println(b)
}
fmt.Println(a)
}
在上面的代码中,我有一个切片,我想在循环中删除它的元素。
我希望输出结果是:
23456
13456
12356
12346
12345
但我得到了:
[2 3 4 5 6]
[2 4 5 6 6]
[2 4 6 6 6]
[2 4 6 6 6]
[2 4 6 6 6]
[2 4 6 6 6]
为什么呢? go document说如果切片的容量不够,它会对元素进行重新分配,我甚至改变了原始切片中的任何内容......
有人可以解释一下这是怎么发生的吗?
答案 0 :(得分:0)
我想我知道为什么。
切片a [:i]将返回一个容量大小为6的切片(作为原始切片),因此追加将不会重新分配新切片但使用原始切片。
答案 1 :(得分:0)
b := append(a[:i], a[i+1:]...)
此代码将更改Slice。 我的代码:
func main() {
a := []int{1, 2, 3, 4, 5, 6}
for i := 0; i < len(a); i++ {
a1 := make([]int,6)
copy(a1, a)
b := make([]int,5)
b = a1[:i]
b = append(b, a1[i+1:]...)
fmt.Println(b)
}
fmt.Println(a)
}