Concurrency 为什么可以';这个程序不能用goroutine打印任何东西吗?
我最近通过谷歌调查了Golang,我遇到了以下问题。然后程序就不会打印任何东西。但如果我删除“go”符号,它将同时打印“goroutine”和“going”Concurrency 为什么可以';这个程序不能用goroutine打印任何东西吗?,concurrency,go,Concurrency,Go,我最近通过谷歌调查了Golang,我遇到了以下问题。然后程序就不会打印任何东西。但如果我删除“go”符号,它将同时打印“goroutine”和“going” 您的程序在goroutines执行之前退出。您可以稍等一会儿,例如通过调用time.Sleep(2*time.Second),但这种行为被认为是不好的做法,因为您的程序可能会运行超过2秒,然后仍然会终止 更好的方法是使用sync.WaitGroup: package main import ( "fmt" "sync" )
您的程序在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()
}
代码需要等待例程完成后才能退出。这样做的一个好方法是传入一个通道,例程使用该通道在完成时发出信号,然后在主代码中等待。见下文 这种方法的另一个优点是,它允许/鼓励您根据返回值执行正确的错误处理
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
}
主程序包
进口(
“fmt”
)
func f(消息字符串,退出chan int){
fmt.Println(味精)
退出,因为在运行goroutine之前会退出main。另外,每隔一天就会问一次这个问题。这是最糟糕的建议。使用channels或sync.WaitGroup
。如果goroutine花费的时间超过2秒,那么就错了。您的答案应该是一个有效的示例,一个好代码的指南。您的答案都不是处于这种状态。谢谢添加正在处理WaitGroup示例。为了更清晰,我删除了sleep示例,希望您不介意:)
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
}