最简单,最干净和“可扩展”的方法是使用
sync.WaitGroup:
var wg = &sync.WaitGroup{}func printElo() { defer wg.Done() fmt.Printf("Elon")}func printHello() { defer wg.Done() fmt.Printf("Hellon")}func main() { fmt.Printf("This will print.") i := 0 for i < 10 { wg.Add(1) go printElo() wg.Add(1) go printHello() i++ } wg.Wait()}输出(在Go Playground上尝试):
This will print.HelloEloHelloEloHelloEloHelloEloHelloEloHelloEloHelloEloHelloEloHelloEloHelloElo
执行以下操作时要遵循的简单“规则”
sync.WaitGroup:
WaitGroup.Add()
在go
语句之前调用“原始” goroutine(开始一个新的)- 建议调用
WaitGroup.Done()
延迟,因此即使goroutine恐慌也可以调用 - 如果要传递
WaitGroup
给其他函数(而不使用全局变量),则必须传递一个指向它的指针,否则WaitGroup
将复制(它是一个结构),并且Done()
在复制时将不会观察到该方法原本的



