我最近通过谷歌调查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
}
答案 0 :(得分:8)
您在执行goroutines之前编程退出。您可以稍等一下,例如通过调用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()
}
答案 1 :(得分:5)
您的代码需要等待例程完成才能退出。执行此操作的一种好方法是传入一个通道,该通道由例程用于在完成时发出信号,然后在主代码中等待。见下文。
这种方法的另一个优点是它允许/鼓励您根据返回值执行正确的错误处理。
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
}