我最近开始使用 go,我对这个程序的执行顺序感到非常困惑。我希望我不是在这里问非常琐碎的问题。这基本上是#69在golang游,与一些的println我已经插入; 链接到操场:http://play.golang.org/p/PXDlD3EA2ffunc fibonacci(c, quit chan int) { x, y := 0, 1 fmt.Println("Inside the fibonacci") for { select { case c <- x: fmt.Println("Inside the for, first case, before reassigning ", x, y) x, y = y, x+y fmt.Println("Inside the for, first case, after reassigning ", x, y) case <-quit: fmt.Println("quit") return } }}func main() { fmt.Println("Begin of Main") c := make(chan int) quit := make(chan int) fmt.Println("Before gonig to the func") go func() { fmt.Println("Inside go routine") fmt.Println("Inside go routine... again") for i := 0; i < 10; i++ { fmt.Println("Inside go routine and the for, before printing the channel") fmt.Println(<-c) } quit <- 0 }() fmt.Println("Before calling to fibonacci") fibonacci(c, quit) fmt.Println("Closing")}在非常详细的输出我得到(见下附图片),有一对夫妇的事情,我不明白:为什么是“里面的斐波那契”线在走程序的问题之前?这是因为go命令之后,编译器只是阅读在同一时间内FUNC和斐波那契?怎么办斐波那契和FUNC互动?func 没有改变通道 c,那么为什么斐波那契会做出反应呢?谁在改变C吗?为什么在斐波那契里面每次都有 5 个打印在一起?诚信我只有2个期待。该功能的输出:
2 回答
HUX布斯
TA贡献1876条经验 获得超6个赞
让我们一步一步来:
*为什么在旅途中常规的那些前“里面的斐波那契”行?这是因为go命令之后,编译器只是在同一时间内FUNC和斐波那契读书?
因为你fibonacci
的 goroutine实际上是在你调用之后启动的,所以调度器需要一点时间来启动,例如,如果你启动了一个调用的 goroutinefmt.Println
并且不做任何等待 in main
,程序将在它被执行之前退出。
* fibonacci 和 func 如何交互?func 没有改变通道 c,那么为什么斐波那契会做出反应呢?谁在改变 c?
fibonacci
正在将数字推入频道,请注意这一部分:
select { case c <- x: //this is sending x to the channel
*为什么在斐波那契里面每次都有 5 个打印在一起?老实说,我只期待 2。
这再次取决于调度程序和fmt.Print*
不锁定标准输出的事实,输出可以按任何顺序发生,因为它是 2 个不同的线程打印内容。
- 2 回答
- 0 关注
- 212 浏览
添加回答
举报
0/150
提交
取消