在Go語(yǔ)言中,可以使用goroutine和channel來(lái)實(shí)現(xiàn)并發(fā)處理同樣的數(shù)據(jù)。下面是一個(gè)簡(jiǎn)單的示例:
package main
import (
"fmt"
"sync"
)
func processData(data int, wg *sync.WaitGroup, resultChan chan int) {
defer wg.Done()
// 在這里進(jìn)行數(shù)據(jù)處理的邏輯,這里簡(jiǎn)單地將數(shù)據(jù)乘以2
result := data * 2
// 將處理結(jié)果發(fā)送到結(jié)果通道
resultChan <- result
}
func main() {
// 創(chuàng)建一個(gè)等待組和結(jié)果通道
var wg sync.WaitGroup
resultChan := make(chan int)
data := []int{1, 2, 3, 4, 5}
// 啟動(dòng)goroutine并發(fā)處理數(shù)據(jù)
for _, d := range data {
wg.Add(1)
go processData(d, &wg, resultChan)
}
// 等待所有g(shù)oroutine完成
go func() {
wg.Wait()
close(resultChan)
}()
// 從結(jié)果通道中讀取處理結(jié)果
for result := range resultChan {
fmt.Println(result)
}
}
在上面的示例中,首先創(chuàng)建了一個(gè)等待組和一個(gè)結(jié)果通道。然后,使用go
關(guān)鍵字啟動(dòng)多個(gè)goroutine并發(fā)處理數(shù)據(jù)。每個(gè)goroutine都會(huì)調(diào)用processData
函數(shù)進(jìn)行數(shù)據(jù)處理,并將處理結(jié)果發(fā)送到結(jié)果通道。在主函數(shù)中,通過(guò)啟動(dòng)一個(gè)匿名goroutine來(lái)等待所有的goroutine完成,并關(guān)閉結(jié)果通道。最后,通過(guò)range resultChan
循環(huán)來(lái)讀取結(jié)果通道中的處理結(jié)果并輸出。