go 例程中的执行顺序

我最近开始使用 go,我对这个程序的执行顺序感到非常困惑。我希望我不是在这里问非常琐碎的问题。


这基本上是#69在golang游,与一些的println我已经插入; 链接到操场:http://play.golang.org/p/PXDlD3EA2f


func 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个期待。

该功能的输出:

http://img2.mukewang.com/61123c9f0001cfb106020865.jpg

慕妹3242003
浏览 213回答 2
2回答

HUX布斯

让我们一步一步来:*为什么在旅途中常规的那些前“里面的斐波那契”行?这是因为go命令之后,编译器只是在同一时间内FUNC和斐波那契读书?因为你fibonacci的 goroutine实际上是在你调用之后启动的,所以调度器需要一点时间来启动,例如,如果你启动了一个调用的 goroutinefmt.Println并且不做任何等待 in&nbsp;main,程序将在它被执行之前退出。*&nbsp;fibonacci 和 func 如何交互?func 没有改变通道 c,那么为什么斐波那契会做出反应呢?谁在改变 c?fibonacci&nbsp;正在将数字推入频道,请注意这一部分:select&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;c&nbsp;<-&nbsp;x:&nbsp;//this&nbsp;is&nbsp;sending&nbsp;x&nbsp;to&nbsp;the&nbsp;channel*为什么在斐波那契里面每次都有 5 个打印在一起?老实说,我只期待 2。这再次取决于调度程序和fmt.Print*不锁定标准输出的事实,输出可以按任何顺序发生,因为它是 2 个不同的线程打印内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go