方式1
package main
import (
"fmt"
"sync"
"time"
)
func doWork(id int, resultChan chan<- int, wg *sync.WaitGroup) {
defer wg.Done() // 表示goroutine完成
time.Sleep(time.Duration(id) * time.Second) // 模拟工作负载
resultChan <- id * 2 // 发送结果到channel
}
func main() {
var wg sync.WaitGroup
resultChan := make(chan int, 5) // 假设我们有5个goroutine
// 启动多个goroutine
for i := 1; i <= 5; i++ {
wg.Add(1) // 增加WaitGroup计数
go doWork(i, resultChan, &wg)
}
// 等待所有goroutine完成
go func() {
wg.Wait() // 等待所有goroutine完成
close(resultChan) // 完成所有工作后关闭channel
}()
// 收集所有结果
for result := range resultChan {
fmt.Println("Result:", result)
}
}
方式2
package main
import (
"fmt"
"time"
)
func doWork(id int, resultChan chan<- int, doneChan chan<- struct{}) {
time.Sleep(time.Duration(id) * time.Second) // 模拟工作负载
resultChan <- id * 2 // 发送结果到channel
doneChan <- struct{}{} // 发送信号表示完成
}
func main() {
resultChan := make(chan int, 5) // 存储结果
doneChan := make(chan struct{}, 5) // 信号channel,表示5个goroutine完成
for i := 1; i <= 5; i++ {
go doWork(i, resultChan, doneChan)
}
// 收集所有结果
for i := 1; i <= 5; i++ {
result := <-resultChan
fmt.Println("Result:", result)
<-doneChan // 等待一个goroutine完成
}
close(resultChan) // 完成后关闭channel
}