我理解,可以从两个方面确认。
第一个就是源码层级的,也就是阅读源码。毕竟,Go 程序的源码基本都可以直接看到。但某种意义上,你得了解什么情况下可能产生并发问题,一般主要是共享变量的数据竞争,
其次,除了阅读源码,Go 针对数据竞争也提供了检测手段,可以通过 go run -race 就可以检测自己的代码是否有竞态问题。
之前翻译过一篇文章,如下:
如果希望测试的话,创建一个共享 map,通过不同的 goroutine 访问。通过 go run -race 检测,之后再将 map 改为 sync.Map 再次检测。