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/[email protected]/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 關注
- 203 瀏覽
添加回答
舉報