golang 多协程赋值 error 问题

发布时间 2023-12-16 12:48:47作者: _小孟同学

近期遇到一个问题

golang 在多协程情况下,对一个 error 进行赋值,本意是无论多少个协程,只要有个一个 error,那么就认为是 error 错误.
但是在实际写的过程中遇到问题就是需不需要加锁,不加锁会影响什么

代码如下(伪代码)

  func main(){
    var err error
    var wg sync.WaitGroup
    for (i:0;i<10;i++){
        wg.Add(1)
        go func(){
            defer wg.Done()
            e:=dosomething()
             if(e != nil){
                err = e
             }
        }()
    }
    wg.Wait()
    if(err != nil){
      fmt.Print(err)
    }
  }

在这个代码中,err 可能被赋值,也可能为 nil
那么假设所有的 dosomething() 操作都 error 了,并且在同一时间进行 err = e 操作,那么会不会有问题?

目前我所了解的是毕竟 error 是一个 interface{},在赋值的时候是一个指针赋值,参考go interface赋值为对象or对象指针
所以即使是多个协程,但是实际执行的汇编语句只有一句,那么就可以不加锁,不知道这种说法对不对

谈谈 Golang 中的 Data Race