1 回答
TA贡献1853条经验 获得超6个赞
由于标准库的 HTTP 服务器在其自己的 goroutine 上调用处理程序,因此您必须同步访问处理程序外部定义的所有变量(其中访问之一是写入)。每当您使用 stdlib 的 HTTP 服务器时都必须执行此操作。使用标准库的多路复用器还是 Gorilla 的多路复用器并不重要。Goroutine 启动发生在多路复用器外部(在调用多路复用器之前)。
如果不这样做(如您的示例中所示),则会发生数据争用,您可以通过使用以下选项运行它来验证-race:
WARNING: DATA RACE
Write at 0x00c000090c30 by goroutine 21:
runtime.mapassign_fast64()
/usr/local/go/src/runtime/map_fast64.go:92 +0x0
main.addData()
/home/icza/gows/src/play/play.go:47 +0x191
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2007 +0x51
github.com/gorilla/mux.(*Router).ServeHTTP()
/home/icza/gows/pkg/mod/github.com/gorilla/mux@v1.7.3/mux.go:212 +0x13e
net/http.serverHandler.ServeHTTP()
/usr/local/go/src/net/http/server.go:2802 +0xce
net/http.(*conn).serve()
/usr/local/go/src/net/http/server.go:1890 +0x837
Previous read at 0x00c000090c30 by goroutine 7:
runtime.mapiternext()
/usr/local/go/src/runtime/map.go:851 +0x0
main.getData()
/home/icza/gows/src/play/play.go:32 +0x194
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2007 +0x51
...
- 1 回答
- 0 关注
- 160 浏览
添加回答
举报