1. 首页
  2. 主题
  3. Go基础

让我蛋疼的goroutine

thinkingbullet · · 3812 次点击
代码如下: 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
你开的chan是有缓冲的,不阻塞,结果就不可预测了。
#3
更多评论
**你的代码看的我也挺蛋疼的** 当你运行`go f()`后,可以理解为新开了一条支线来跑`f()方法`,主线还在继续跑 分析你说的两种情况 1. Print在先 主线在执行Print时,支线在执行`c &lt;- 0`,所以a还是空的,所以打印是空 2. &lt;-在先 主线是阻塞状态,必须等管道c里有内容后才会继续执行 所以支线的`c &lt;- 0`执行后,主线的`&lt;-c`才会执行 主线`&lt;-c`执行时,支线正在执行`a = &#34;hello, world&#34;` 然后主线就能正确打印出hello world了 这是假设所有执行的时间都一样的前提下 如果有某行代码需要执行时间比较长,那结果也会不同
#1
并行的程序执行顺序不可测
#2

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中