环境:go1.7.3 win7 64bit
代码1的执行结果是隔一秒只打印0,不符合预期
```
0
0
0
...
```
把代码1改成代码2,结果就对了
```
353036023
713389754
1073135313
...
```
这是个什么情况,有大佬知道吗
**代码1:**
```
package main
import (
"fmt"
"time"
)
func main() {
i := 0
go func () {
for true {
//隔一秒打印i
time.Sleep(1000000000)
fmt.Println(i)
}
}()
for true {
i++
}
}
```
**代码2:**
```
package main
import (
"fmt"
"time"
)
func main() {
i := 0
go func () {
for true {
i++
}
}()
for true {
//隔一秒打印i
time.Sleep(1000000000)
fmt.Println(i)
}
}
```
第 1 条附言 ·
已解决这个问题,问题原因是go编译器默认优化了代码,在build的时候添加-gcflags '-N -l'禁用优化就可以了
上面的截图不好看代码,我发这里,你可以自己研究一下
```go
func testg1() {
i := int64(0)
go func() {
for true {
//隔一秒打印i
time.Sleep(1000000000)
fmt.Println(i) // 0
// runtime.GC() // forever block
}
}()
for true {
i++
}
}
func testg2() {
i := int64(0)
go func() {
for true {
//隔一秒打印i
time.Sleep(1000000000)
fmt.Println(atomic.LoadInt64(&i)) // 778880009
}
}()
for true {
atomic.AddInt64(&i, 1)
}
}
func testg4() {
i := int64(0)
go func() {
for true {
i++
}
}()
for true {
//隔一秒打印i
time.Sleep(1000000000)
fmt.Println(i) // 0
// runtime.GC() // forever block
}
}
func testg5() {
i := int64(0)
go func() {
for true {
//隔一秒打印i
time.Sleep(1000000000)
fmt.Println(i) // xxxx
// runtime.GC() // forever block
}
}()
for true {
f := func() {
i++
y := int64(0)
y++
_ = y * i
}
f()
}
}
```
生成汇编代码,用 go tool compile -S go文件
#4
更多评论