```go
package main
import (
"fmt"
"time"
)
func main() {
var num = 10
var p = &num
c := make(chan int)
go func() {
time.Sleep(time.Second)
c <- *p //-----> 11
//c <- num //----->10
}()
time.Sleep(2 * time.Second)
num++
fmt.Println(<-c)
fmt.Println(p)
return
}
```
为什么 *p 和num的结果不一样
这个问题就是data race的问题,规范里面对`Send statements`的说明是:
`Both the channel and the value expression are evaluated before communication begins`
只要在通过同步方式保证`c <- *p`是先于`num++`执行的情况下,从c里面读取到的值一定是10,不管是`c <- *p`还是`c <- num`
如果不能保证`c <- *p`和`num++`的同步,结果就是不确定的,并且考虑`c <- *p`和`c <- num`的结果为什么不同也没多大意义
#18
更多评论