是否不能保证所有语句都在 goroutine 中执行?

Is it not guaranteed that all statements gets executed in a goroutine?

当我运行以下代码时没有错误,但也没有打印任何内容:

package main

import "fmt"

func fibonacci(c, quit chan int) {
    x, y := 0, 1
    counter := 0
    for {
        
        select {
        case c <- x:
            fmt.Println("sent x", x)
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
            return
        }
        
        counter += 1
        fmt.Println("Counter", (counter));
        
    }
    
    fmt.Println("Fib exiting");
}

func main() {
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            fmt.Println("got" , <-c)
        }
        quit <- 0
        fmt.Println("Anon exiting");
    }()
    go fibonacci(c, quit)
}

我在想至少应该打印 "Fib exiting"。如果我在主 goroutine 中正常执行 fibonacci(),它就可以工作。

提前致谢...

Is it not guaranteed that all statements gets executed in a goroutine?

根据您的程序控制流程应执行的所有语句都将执行。

您的 fmt.Println("Fib exiting") 打印调用没有执行,因为 main() 在生成两个 goroutine 后立即返回。

然而,即使 main() 已正确同步,fmt.Println("Fib exiting") 仍然是无法访问的代码,因为 fibonacci() 中的 select 语句要么在 c 上发送,要么在 quit 上接收,并且这些情况都没有跳出循环。