-race
属性用来做竞态监测,判断是否存在并发读写单个变量的情况。在执行 go test
、go build
、go run
的时候都可以执行这个参数。
这个检测是发生在运行时的,如果你的代码没有被执行,那么是无法监测出来的。存在并发不写不一定有问题,但是做到心知肚明,能避免一些无意识的小坑。
func main() {
var wg sync.WaitGroup
wg.Add(10)
for i := 0; i < 10; i++ {
go func() {
defer wg.Done()
fmt.Println(i)
}()
}
wg.Wait()
}
多个 goroutine 协程并发打印递归值,肯定是有问题的,最终会出现很多重复的输出。如果我们使用静态编译运行这段代码:
go run -race main.go
观察控制台的输出,明确的打印了读和写并发冲突的代码行号,以及对应的 goroutine 创建信息
如果你使用的是 goland 开发工具,我们可以执行在编译环境变量中指定 -race
属性