是否不能保证所有语句都在 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
上接收,并且这些情况都没有跳出循环。
当我运行以下代码时没有错误,但也没有打印任何内容:
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
上接收,并且这些情况都没有跳出循环。