代码:
package main
func main() {
c := make(chan bool)
m := make(map[string]string)
go func() {
m["1"] = "a" // First conflicting access.
c <- true
}()
m["2"] = "b" // Second conflicting access.
<-c
for k, v := range m {
fmt.Println(k, v)
}
}
执行 go run -race test.go
,结果为
WARNING: DATA RACE
Write at 0x00c00011c180 by goroutine 7:
runtime.mapassign_faststr()
/usr/local/Cellar/go/1.18/libexec/src/runtime/map_faststr.go:203 +0x0
main.main.func1()
/Users/admin/Downloads/test.go:9 +0x50
Previous write at 0x00c00011c180 by main goroutine:
runtime.mapassign_faststr()
/usr/local/Cellar/go/1.18/libexec/src/runtime/map_faststr.go:203 +0x0
main.main()
/Users/admin/Downloads/test.go:12 +0x127
Goroutine 7 (running) created at:
main.main()
/Users/admin/Downloads/test.go:8 +0x10a
==================
1 a
2 b
Found 1 data race(s)
exit status 66
官方文档: https://go.dev/doc/articles/race_detector
大概了解了一下 Memory Model ,还有 CPU 的乱序执行什么的,对这个例子还是不太理解,有没有大佬指点一二。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.