-3 concurrency go
我最近通过谷歌调查Golang,我遇到了以下问题.然后程序不打印任何东西.但如果我删除"go"符号,它将打印"goroutine"和"going".
package main
import "fmt"
func f(msg string) {
fmt.Println(msg)
return
}
func main() {
go f("goroutine")
go func(msg string) {
fmt.Println(msg)
return
}("going")
return
}
Run Code Online (Sandbox Code Playgroud)
您在执行goroutine之前编程退出.你可以等一下,例如通过调用time.Sleep(2 * time.Second),但这种行为被认为是不好的做法,因为你的程序运行时间可能超过2秒,然后会终止.
更好的方法是使用sync.WaitGroup:
package main
import (
"fmt"
"sync"
)
func f(msg string, wg *sync.WaitGroup) {
fmt.Println(msg)
wg.Done()
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go f("goroutine", &wg)
wg.Add(1)
go func(msg string) {
fmt.Println(msg)
wg.Done()
}("going")
wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)
您的代码需要在退出之前等待例程完成.执行此操作的一种好方法是传入一个通道,该通道由例程用于在完成时发出信号,然后在主代码中等待.见下文.
此方法的另一个优点是它允许/鼓励您根据返回值执行正确的错误处理.
package main
import (
"fmt"
)
func f(msg string, quit chan int) {
fmt.Println(msg)
quit <- 0
return
}
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go f("goroutine", ch1)
go func(msg string, quit chan int) {
fmt.Println(msg)
quit <- 0
return
}("going", ch2)
<-ch1
<-ch2
return
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |