社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
首先看如下的代码:
func main() {
go func() {
fmt.Println("123")
}()
go func() {
fmt.Println("ABC")
}()
}
发现最后控制台没有任何输出,如图:
可以使用通道解决:
func main() {
ch := make(chan int)
count := 2
go func() {
fmt.Println("123")
ch <- 1
}()
go func() {
fmt.Println("ABC")
ch <- 1
}()
for range ch {
count--
if count == 0 {
close(ch)
}
}
}
可以解决:
123
ABC
其实,golang中内置了一套简单用于等待的编程方式:sync.WaitGroup
,使用方式如下:
func main() {
wg := &sync.WaitGroup{}
wg.Add(2)
go func() {
fmt.Println("123")
wg.Done()
}()
go func() {
fmt.Println("ABC")
wg.Done()
}()
wg.Wait()
}
可以解决:
123
ABC
总结:
WaitGroup内部实现了一个计数器,用来记录未完成的操作个数,类似于方法一的“count
” ,共提供了3个方法:Add()
: 用于添加计数个数Done()
: 用于表示某任务已经完成,未完成任务计数减1Wait()
: 用来等待所有的操作结束(即计数变为0),该函数会在计数不为零的时候等待,在计数为零的时候立即返回。
可见用sync.WaitGroup
是最简单的方式。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!