代码如下:
package main
import (
"fmt"
)
var a string
var c = make(chan int, 10)
func f() {
c <- 0
a = "hello, world"
}
func main() {
go f()
fmt.Println(a)
<-c
}
在main中把fmt.Println(a)和<-c位置交换得到的结果就不一样,这到底是为什么啊,这叫人怎么理解goroutine
更多评论
**你的代码看的我也挺蛋疼的**
当你运行`go f()`后,可以理解为新开了一条支线来跑`f()方法`,主线还在继续跑
分析你说的两种情况
1. Print在先
主线在执行Print时,支线在执行`c <- 0`,所以a还是空的,所以打印是空
2. <-在先
主线是阻塞状态,必须等管道c里有内容后才会继续执行
所以支线的`c <- 0`执行后,主线的`<-c`才会执行
主线`<-c`执行时,支线正在执行`a = "hello, world"`
然后主线就能正确打印出hello world了
这是假设所有执行的时间都一样的前提下
如果有某行代码需要执行时间比较长,那结果也会不同
#1