猿问

从切片中同时删除

我有一个数组 X ,如果条件为真,我正在尝试对其进行范围并删除一些元素。在没有任何并发的情况下执行此操作可以正常工作,但是当我尝试同时执行此操作时出现错误:“切片边界超出范围”


func main() {

    X := make([][]int32, 10)

    for i := 0; i < 10; i++ {

        X[i] = []int32{int32(i), int32(i)}

    }


    ch := make(chan int, 20)

    var wg sync.WaitGroup


    fmt.Println(X)


    for i := 0; i < 20; i++ {

        wg.Add(1)


        go func() {

            defer wg.Done()


            for index := range X {

                // check some condition

                if X[index][0]%2 == 0 && index < len(X)-1 {


                    ch <- index

                    break

                }

            }

        }()

    }


    for {

        ind, ok := <-ch

        if ok {

            X = append(X[:ind], X[ind+1:]...)

        } else {

            fmt.Println("closed chan")

            break

        }


    }


    wg.Wait()

    fmt.Println(X)


}


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


有什么方法可以使用索引并通过通道发送它,然后从不同的 goroutine 中删除相应的元素?


慕斯王
浏览 130回答 2
2回答

江户川乱折腾

第一:你为什么要这样删除?您是否正在尝试解决更大的问题?如果这是您想要的方式,那么:您正在使用缓冲通道,因此删除 goroutine 可能会在另一个 goroutine 正在处理切片时从切片中删除项目,从而导致意外结果。此外,您没有关闭通道,因此 for 循环永远不会终止。使用无缓冲通道,并在单独的 goroutine 中运行删除循环。wg.Wait然后在终止删除 goroutine之后关闭通道。

30秒到达战场

将要保留的元素复制到切片的开头。删除 goroutine。keep := 0for index := range X {&nbsp; &nbsp; if X[index][0]%2 == 0 && index < len(X)-1 {&nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; }&nbsp; &nbsp; X[keep] = X[index]&nbsp; &nbsp; keep++}X = X[:keep]在操场上运行它。
随时随地看视频慕课网APP

相关分类

Go
我要回答