在Go语言中,可以使用sync.WaitGroup
来等待多个goroutine完成并收集它们的结果,而不必使用zip
包。
下面是一个示例代码,展示了如何使用sync.WaitGroup
等待多个goroutine完成并收集它们的结果:
package main
import (
"fmt"
"sync"
)
func main() {
// 创建一个WaitGroup
var wg sync.WaitGroup
// 定义一个结果的通道
resultCh := make(chan string)
// 定义要处理的数据
data := []string{"hello", "world", "golang"}
// 设置WaitGroup的计数器
wg.Add(len(data))
// 启动goroutine处理数据
for _, val := range data {
go func(input string) {
// 处理数据
result := processData(input)
// 将处理结果发送到通道中
resultCh <- result
// 通知WaitGroup当前goroutine已完成
wg.Done()
}(val)
}
// 启动一个goroutine等待所有goroutine完成
go func() {
// 等待WaitGroup计数器归零
wg.Wait()
// 关闭结果通道
close(resultCh)
}()
// 遍历结果通道收集结果
for result := range resultCh {
fmt.Println(result)
}
}
// 模拟处理数据的函数
func processData(input string) string {
return input + " processed"
}
上述代码中,首先创建了一个WaitGroup
用于等待goroutine完成。然后定义了一个结果的通道resultCh
,用于收集goroutine的处理结果。
接下来,设置了WaitGroup
的计数器为要处理的数据的长度,即每个goroutine都需要完成处理。然后,通过for
循环启动多个goroutine来处理数据。
在每个goroutine内部,对数据进行处理,并将处理结果发送到结果通道resultCh
中。然后,通过Done()
方法通知WaitGroup
当前goroutine已完成处理。
接着,启动一个额外的goroutine来等待所有goroutine完成。在这个goroutine内部,使用Wait()
方法等待WaitGroup
的计数器归零,并在所有goroutine都完成后关闭结果通道。
最后,通过for
循环遍历结果通道resultCh
,收集并打印每个goroutine的处理结果。
这种方法避免了使用zip
包,而是使用了sync.WaitGroup
和通道来实现等待多个goroutine完成并收集结果的功能。