当切片元素被移除时,原来的切片被破坏

package main


import (

    "fmt"

)


func main() {

    // test data

    var a = [][]int{

        []int{1,2},

        []int{3,4},

        []int{5,6},

        []int{7,8},

    }


    for i := range a {

        fmt.Println(a) // print out

        _ = append(a[:i], a[i+1:]...) // remove element

    }

}


预期结果


[[1 2] [3 4] [5 6] [7 8]]

[[1 2] [3 4] [5 6] [7 8]]

[[1 2] [3 4] [5 6] [7 8]]

[[1 2] [3 4] [5 6] [7 8]]

实际结果


[[1 2] [3 4] [5 6] [7 8]]

[[3 4] [5 6] [7 8] [7 8]]

[[3 4] [7 8] [7 8] [7 8]]

[[3 4] [7 8] [7 8] [7 8]]

https://play.golang.org/p/KahcX1MmDHO


为什么会这样?原来的切片坏了。:(


人到中年有点甜
浏览 119回答 1
1回答

一只斗牛犬

当您重新切片时,您不会更改底层数组。所以第一次通过你的循环 ( append(a[:0], a[1:]...)) 你创建a[:0]了一个指向元素 0 的 len 0 (cap 4)a[1:]切片和指向元素 1 的 len 3 (cap 3) 切片。正如@icza 指出的那样,append()以这种方式使用只是移动了底层数组元素。对于每个循环迭代,都会发生这种情况:0:元素 1-3 移动到位置 0-21:元素 2-3 移动到位置 1-22:元素 3 移动到位置 23:没有任何移动,因为 a[4:] 的长度为零这给出了您看到的更改后的值。顺便说一句,请发布显示问题的最简单的代码。嵌套切片无关紧要。func main() {    var a = []int{1,2,3,4}    for i := range a {        fmt.Println(a)        _ = append(a[:i], a[i+1:]...)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go