当没有线路调用它时,控制如何转到主 goroutine?
How does control go to a main goroutine when no line calls it?
// _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 main
import "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 行?
当您将 Go 应用程序编译成可执行二进制文件时,编译器会在二进制文件中包含一个 运行time。当 运行ning 你的应用程序时,这个 运行 时间负责调度和 运行ning goroutines。
在第 17 行启动一个 goroutine,因此 运行time 将安排 运行 它与 main
goroutine 同时进行,并且可能是并行的(如果有足够的内核并且 GOMAXPROCS 允许,详情见 Concurrency is not parallelism).
The function value and parameters are evaluated as usual in the calling goroutine, but unlike with a regular call, program execution does not wait for the invoked function to complete. Instead, the function begins executing independently in a new goroutine. When the function terminates, its goroutine also terminates. If the function has any return values, they are discarded when the function completes.
// _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 main
import "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 行?
当您将 Go 应用程序编译成可执行二进制文件时,编译器会在二进制文件中包含一个 运行time。当 运行ning 你的应用程序时,这个 运行 时间负责调度和 运行ning goroutines。
在第 17 行启动一个 goroutine,因此 运行time 将安排 运行 它与 main
goroutine 同时进行,并且可能是并行的(如果有足够的内核并且 GOMAXPROCS 允许,详情见 Concurrency is not parallelism).
The function value and parameters are evaluated as usual in the calling goroutine, but unlike with a regular call, program execution does not wait for the invoked function to complete. Instead, the function begins executing independently in a new goroutine. When the function terminates, its goroutine also terminates. If the function has any return values, they are discarded when the function completes.