谁能告诉我为什么会出现恐慌。这个demo的背景是验证切片并发写入的行为,但是当我运行demo时,偶尔会出现panic(并非总是如此)。所以为什么?
代码:
func main() {
for i := 0; i < 10000; i++ {
// when capacity > 2, panic disappear
b := make([]int, 2, 2)
b[0], b[1] = 0, 1
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
b = append(b, 3)
wg.Done()
}()
wg.Add(1)
go func() {
b = append(b, 4)
wg.Done()
}()
wg.Wait()
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
panic: sync: negative WaitGroup counter
goroutine 12821 [running]:
sync.(*WaitGroup).Add(0x0?, 0xc0000f4ba0?)
/usr/local/go/src/sync/waitgroup.go:83 +0xda
sync.(*WaitGroup).Done(...)
/usr/local/go/src/sync/waitgroup.go:108
main.main.func1()
/Users/liushi/Projects/go/golang-demo/main.go:54 +0x97
created by main.main
/Users/liushi/Projects/go/golang-demo/main.go:48 +0x11f …Run Code Online (Sandbox Code Playgroud)