非法竞态访问数据 是指无任何同步保护下并行读写同一份数据。
go命令内置了非法竞态访问数据的检测工具。可以使用go run -race或者go build -race来进行竞争检测。

示例

package main

import (
	"fmt"
	"time"
)

func main() {
	a := 1
	go func() {
		a = 2
	}()
	a = 3
	fmt.Println("a is ", a)

	time.Sleep(1 * time.Second)
}

运行

$ go run -race main.go
a is  3
==================
WARNING: DATA RACE
Write at 0x00c000064058 by goroutine 6:
  main.main.func1()
      ....../testing/main.go:11 +0x3f

Previous write at 0x00c000064058 by main goroutine:
  main.main()
      ....../testing/main.go:13 +0x8f

Goroutine 6 (running) created at:
  main.main()
      ....../testing/main.go:10 +0x81
==================
Found 1 data race(s)
exit status 66

命令输出了Warning,警告goroutine 6在11行与main goroutine第13行产生了竞态访问,Goroutine 6main.go第10行创建。

-race会引发CPU和内存的使用增加,所以可以在测试环境使用,不建议在正式环境使用。