近期遇到一个问题
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对象指针
所以即使是多个协程,但是实际执行的汇编语句只有一句,那么就可以不加锁,不知道这种说法对不对