@
wsseo @
davidyanxw 这两天有点事就没有回答两位的问题。刚刚做了一些试验,发现了更有意思的地方。
1.如果写 chan 的地方是算术表达式,go 会提前进行预处理(对 c<-*p+0),可能已经换成 c<-123,所有大概率返回 123
2.如果是值,就换按正常逻辑往下走。time.Sleep 之后,两个 go 程开始了竞争,num=789 的执行速度,比唤醒生产者 chan+写数据快,所有大概率返回 789 。
当然上面从数据中总结的规律特别依赖 go 的版本(go 1.13.1),大家也不要太在意。也许哪天人家(Go Core Team)就改了。就当乐一乐,原来 go 还有一些小动作。
```go
package main
import (
"fmt"
"time"
)
var x = 0
func call() {
var num = 123
var p = &num
c := make(chan int)
go func() {
//c <- *p + 0 //大概率返回 123
c <- *p // 大概率返回 789
}()
time.Sleep(time.Second / 1000)
num = 789
readValue := <-c
if readValue == 123 {
fmt.Printf("hello %d\n", readValue)
}
}
func main() {
for i := 0; i < 1000000; i++ {
call()
}
}
```