给定代码的执行流程将如何?go 例程在这里将如何执行?

(并发编程新手)有疑问为什么 goroutine 的执行流程在这里有点奇怪?


golang 中 goroutine 和通道的初学者。


func main() {

    // Set up the pipeline.

    c := gen(2, 3)

    out := sq(c)


    // Consume the output.

    fmt.Println(<-out) // 4

    fmt.Println(<-out) // 9

}


func sq(in <-chan int) <-chan int {

    out := make(chan int)

    go func() {

        for n := range in {

            out <- n * n

        }

        close(out)

    }()

    return out

}


func gen(nums ...int) <-chan int {

    out := make(chan int)

    go func() {

        for _, n := range nums {

            out <- n

        }

        close(out)

    }()

    return out

}

https://img2.mukewang.com/64c7776f00018e0710050608.jpg

慕尼黑8549860
浏览 63回答 1
1回答

翻过高山走不出你

一旦调用gen和sq完成,就会有 3 个 goroutine 同时运行。它们在通道之间传递数据,因此执行会产生相同的结果。根内内方主要的他们总是传递至少 2 条信息,因此按以下顺序运行代码gen-inner&nbsp;out <- n-2-> sq-inner&nbsp;out <- n * n-4-> mainprintln(<-out)gen-inner&nbsp;out <- n-3-> sq-inner&nbsp;out <- n * n-9-> mainprintln(<-out)还可能发生第三遍,但它可能会在maingoroutine 结束时被跳过。gen-inner&nbsp;close()-close-> sq-inner&nbsp;close(out)-close->
打开App,查看更多内容
随时随地看视频慕课网APP