Go语言并发(goroutine)需要注意的几个点

56 阅读1分钟

并发往往都伴随着共享数据安全问题,比如并发对某一个变量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全部都被输出,但是不能摆正输出的顺序。