为了账号安全,请及时绑定邮箱和手机立即绑定

从切片中同时删除

从切片中同时删除

Go
慕斯王 2022-07-11 16:49:48
我有一个数组 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 中删除相应的元素?
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

第一:你为什么要这样删除?您是否正在尝试解决更大的问题?

如果这是您想要的方式,那么:

您正在使用缓冲通道,因此删除 goroutine 可能会在另一个 goroutine 正在处理切片时从切片中删除项目,从而导致意外结果。此外,您没有关闭通道,因此 for 循环永远不会终止。

使用无缓冲通道,并在单独的 goroutine 中运行删除循环。wg.Wait然后在终止删除 goroutine之后关闭通道。


查看完整回答
反对 回复 2022-07-11
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

将要保留的元素复制到切片的开头。删除 goroutine。


keep := 0

for index := range X {

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

        continue

    }

    X[keep] = X[index]

    keep++

}

X = X[:keep]

在操场上运行它。


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号