并发往往都伴随着共享数据安全问题,比如并发对某一个变量count进行自增操作,就可能存在某几个协程同时对count进行自增,导致count只增加了一,因此,并发操作共享变量的时候,特别需要注意是否需要加锁。
for range 需要注意的点
func main() {
wg := sync.WaitGroup{}
wg.Add(5)
for i := 0; i < 5; i++ {
go func() {
defer wg.Done()
fmt.Println(i)
}()
}
wg.Wait()
}
这里并不会像想象中那样将输出:1,2,3,4,5,而可能是5,5,5,5,5。因为在go协程执行输出的时候,可能for循环就已经结束了,因此i变为了5,全部输出为5;因此我们需要给func加一个参数,将当前的i值拷贝一下:
func main() {
wg := sync.WaitGroup{}
wg.Add(5)
for i := 0; i < 5; i++ {
go func(j int) {
defer wg.Done()
fmt.Println(j)
}(i)
}
wg.Wait()
}
此时1,2,3,4,5都被拷贝进了func函数中,输出的时候就能保证1,2,3,4,5全部都被输出,但是不能摆正输出的顺序。