首先看如下的代码:
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()
: 用于表示某任务已经完成,未完成任务计数减1
Wait()
: 用来等待所有的操作结束(即计数变为0),该函数会在计数不为零的时候等待,在计数为零的时候立即返回。
可见用sync.WaitGroup
是最简单的方式。