//定义这个WaitGroup是为了 go协程执行完毕后wg.Wait() 放行主线程继续往下	
	wg := sync.WaitGroup{}
	wg.Add(10)//表示调用异步次数
	for i := 0; i < 10; i++ {
		go func(i int) {
			fmt.Println(i)
		wg.Done()//调用次数减1
		}(i)
	}
//wg 是为了等待异步执行完毕 有这句话就算主程序完成了程序还是要等待 直到异步完成为止
	wg.Wait()
	fmt.Println("ok")

//示例如下

func Aaa(wg *sync.WaitGroup) {
	fmt.Println("Aaa")
	wg.Done()
}
func Baa(wg *sync.WaitGroup) {
	fmt.Println("Baa")
	wg.Done()
}
func Caa(wg *sync.WaitGroup) {
	fmt.Println("Caa")
	wg.Done()
}
func Daa(wg *sync.WaitGroup) {
	fmt.Println("Daa")
	wg.Done()
}
func main() {
	wg := sync.WaitGroup{}
	wg.Add(4)
	go Aaa(&wg)
	go Baa(&wg)
	go Caa(&wg)
	go Daa(&wg)
	wg.Wait()
	fmt.Println("ok")
}