鉴于下面的代码,我试图理解为什么Go竞赛检测器(go run -race example.go)不会抱怨竞争条件. var count intfunc main() { http.HandleFunc("/a/", func(w http.ResponseWriter, r *http.Request) { count++ fmt.Println(count) })
var count int func main() { http.HandleFunc("/a/", func(w http.ResponseWriter, r *http.Request) { count++ fmt.Println(count) }) http.HandleFunc("/b/", func(w http.ResponseWriter, r *http.Request) { count++ fmt.Println(count) }) log.Fatal(http.ListenAndServe(":8080", nil)) }
据我所知,Go HTTP Server在单独的goroutine中响应所有请求.考虑到这一点,处理程序函数对全局计数变量的增量不会发生在与主goroutine分开的goroutine中,从而构成数据竞争吗?
如果这不是数据竞赛,我非常想知道原因.
这是一场数据竞赛,但是比赛探测器并没有报告没有发生的比赛.您需要确保测试中有并发调用,并确保GOMAXPROCS> 1也可以帮助清除它们.