Concurrency go例程中的执行顺序

Concurrency go例程中的执行顺序,concurrency,go,goroutine,Concurrency,Go,Goroutine,我最近开始使用go,我真的很困惑这个程序的执行顺序。我希望我不是在问一些非常琐碎的问题 这基本上是golang tour中的#69,我插入了一些Println;连结至游乐场: func fibonacci(c,quit-chan-int){ x、 y:=0,1 fmt.Println(“在斐波那契内部”) 为了{ 挑选{ 案例c让我们一步一步来: *为什么“fibonacci”行在go例程中的行之前?这是因为在go命令之后,编译器只是同时读取func和fibonacci中的行吗? 由于go例程实

我最近开始使用go,我真的很困惑这个程序的执行顺序。我希望我不是在问一些非常琐碎的问题

这基本上是golang tour中的#69,我插入了一些Println;连结至游乐场:

func fibonacci(c,quit-chan-int){
x、 y:=0,1
fmt.Println(“在斐波那契内部”)
为了{
挑选{

案例c让我们一步一步来:

*为什么“fibonacci”行在go例程中的行之前?这是因为在go命令之后,编译器只是同时读取func和fibonacci中的行吗? 由于go例程实际上是在调用
fibonacci
之后启动的,因此调度程序需要一点时间来启动,例如,如果启动一个调用
fmt.Println
的goroutine,并且在
main
中不执行任何等待操作,则程序将在执行之前退出

*斐波那契和func是如何相互作用的?func没有改变通道c,那么为什么斐波那契会反应?谁在改变通道c?
fibonacci
正在将数字推入频道,请注意这一部分:

select {
        case c <- x: //this is sending x to the channel
选择{

案例c让我们一步一步来:

*为什么“fibonacci”行在go例程中的行之前?这是因为在go命令之后,编译器只是同时读取func和fibonacci中的行吗? 由于go例程实际上是在调用
fibonacci
之后启动的,因此调度程序需要一点时间来启动,例如,如果启动一个调用
fmt.Println
的goroutine,并且在
main
中不执行任何等待操作,则程序将在执行之前退出

*斐波那契和func是如何相互作用的?func没有改变通道c,那么为什么斐波那契会反应?谁在改变通道c?
fibonacci
正在将数字推入频道,请注意这一部分:

select {
        case c <- x: //this is sending x to the channel
选择{

案例c并不是一个真正的答案,但我发现这个演示非常有助于理解渠道的工作原理:
在这里,您可以找到问题的答案。

这并不是一个真正的答案,但我发现这个演示非常方便,可以帮助您了解频道的工作原理:
在这里,您可以找到问题的答案。

操场上运行的是一个操作系统线程
GOMAXPROCS=1
,因此我不会用调度程序的“花时间”和“线程”以及缺少锁定来表达这一点,而是调度程序可以在goroutines之间任意选择,只要两者都可以运行(在这种情况下,直到一个信道阻塞发送或接收)。可能会尝试将其合成一个答案,但这是一些工作。:PThanks@OneOfOne这让事情变得更清楚了,但我有一个后续问题。因为是斐波那契改变了c,基本上func向斐波那契询问10个不同的x值,然后通过退出通道退出斐波那契?@我是的,斐波那契会继续写信给他永远或直到有人将某些内容写入退出通道,这是您的其他函数在读取1值后所做的。@OneOfOne谢谢。这是因为通道没有缓冲,对吗?否则fibonacci将在等待func读取/清空通道之前继续在通道上写入?@meto这是正确的一旦fibonacci退出,如果通道被缓冲,它仍然会有一些值。游乐场运行的是
GOMAXPROCS=1
,一个操作系统线程,所以我不会用调度程序的“花时间”和“线程”来表达这一点并且没有锁定,但是调度器可以在goroutine之间任意选择,只要两个goroutine都可以运行(在这种情况下,直到一个goroutine阻塞了通道发送或接收)。可能会尝试将其合成一个答案,但这是一些工作。:PThanks@OneOfOne这让事情变得更清楚了,但我有一个后续问题。因为是斐波那契改变了c,基本上func向斐波那契询问10个不同的x值,然后通过退出通道退出斐波那契?@我是的,斐波那契会继续写信给他永远或直到有人将某些内容写入退出通道,这是您的其他函数在读取1值后所做的。@OneOfOne谢谢。这是因为通道没有缓冲,对吗?否则fibonacci将在等待func读取/清空通道之前继续在通道上写入?@meto这是正确的一旦斐波那契退出,通道中仍会有一些值,如果它被缓冲的话。