// _Closing_ a channel indicates that no more values// will be sent on it. This can be useful to communicate// completion to the channel's receivers.package mainimport "fmt"// In this example we'll use a `jobs` channel to// communicate work to be done from the `main()` goroutine// to a worker goroutine. When we have no more jobs for// the worker we'll `close` the `jobs` channel.func main() { jobs := make(chan int, 5) done := make(chan bool) fmt.Println("1") go func() { for { fmt.Println("4") j, more := <-jobs if more { fmt.Println("received job", j) } else { fmt.Println("received all jobs") done <- true return } } }() fmt.Println("2") // This sends 3 jobs to the worker over the `jobs` // channel, then closes it. for j := 1; j <= 3; j++ { fmt.Println("3", j) jobs <- j fmt.Println("sent job", j) } fmt.Println("5") close(jobs) fmt.Println("6") fmt.Println("sent all jobs") //How does control go from here to the main's go routine - line 18. Who call's it? and How? // We await the worker using the // [synchronization](channel-synchronization) approach // we saw earlier. <-done fmt.Println("7")}https://play.golang.org/p/Xe_wh3YTmwk控制如何从第 46 行转到第 18 行?
1 回答

慕妹3242003
TA贡献1824条经验 获得超6个赞
当您将 Go 应用程序编译为可执行二进制文件时,编译器会在二进制文件中包含一个运行时。运行您的应用程序时,此运行时负责调度和运行 goroutine。
在第 17 行中,您启动了一个 goroutine,因此运行时将安排与main
goroutine 并发运行它,并且可能并行运行(如果有足够的内核并且 GOMAXPROCS 允许,有关详细信息,请参阅Concurrency is not parallelism)。
函数值和参数在调用 goroutine 中像往常一样被评估,但与常规调用不同,程序执行不会等待调用的函数完成。相反,该函数开始在一个新的 goroutine 中独立执行。当函数终止时,它的 goroutine 也会终止。如果函数有任何返回值,它们会在函数完成时被丢弃。
- 1 回答
- 0 关注
- 157 浏览
添加回答
举报
0/150
提交
取消