由于golang中的go是非常方便的,加上函数又非常容易隐藏go。
所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题。
所以在本质上说,goroutine的使用增加了函数的危险系数。比如一个全局变量或公共变量,如果没有加上锁,我们写一个比较庞大的项目下来,就根本不知道这个变量是不是会引起多个goroutine竞争。
看一下下面的例子,思考下val变量是否需要加锁?
package main
import(
"fmt"
"time"
)
func main() {
val := 1
go func(){
val = 2
}()
val = 3
fmt.Println("val:",val)
for{
time.Sleep(time.Second)
}
}
结果:
这个命令输出了Warning,告诉我们,goroutine7运行到第110行和main goroutine运行到第112行的时候触发竞争了。
而且goroutine7是在第109行的时候产生的。
结论:go run - race *.go 命令可以帮助检查代码是否遗漏的加锁,竞争检测。