为了账号安全,请及时绑定邮箱和手机立即绑定

go 例程中的执行顺序

go 例程中的执行顺序

Go
慕妹3242003 2021-08-10 16:44:52
我最近开始使用 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 个不同的线程打印内容。


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信