据我所知,够程需要有参考WaitGroup对象调用完成(),这意味着,我必须要么使够程接受WaitGroup对象,或使WaitGroup对象全局该goroutine。
我不同意WaitGroup与其他语言相比是一个倒退。我真的很喜欢它的简单。但是,我确实同意传递WaitGroup对象意味着并发逻辑将与您的业务逻辑混合在一起,而我不喜欢这种情况。
所以我想出了这个通用的功能来解决这个问题对我来说:
// Parallelize parallelizes the function calls
func Parallelize(functions ...func()) {
var waitGroup sync.WaitGroup
waitGroup.Add(len(functions))
defer waitGroup.Wait()
for _, function := range functions {
go func(copy func()) {
defer waitGroup.Done()
copy()
}(function)
}
}
下面是一个例子:
func1 := func() {
for char := 'a'; char < 'a' + 3; char++ {
fmt.Printf("%c ", char)
}
}
func2 := func() {
for number := 1; number < 4; number++ {
fmt.Printf("%d ", number)
}
}
Parallelize(func1, func2) // a 1 b 2 c 3