Golang — 简单地利用sync.WaitGroup并发处理批量数据

package main

import (
	"fmt"
	"strconv"
	"sync"
)

type Data struct {
	ID   int
	Name string
	Age  int
}

func syncRun(data []*Data) {
	count := len(data)

	var wg sync.WaitGroup

	// 逐个加入待处理队列
	jobChan := make(chan *Data, count)
	for _, v := range data {
		jobChan <- v
	}

	//创建10个协程并行处理
	workerCount := 10
	for i := 0; i < workerCount; i++ {
		wg.Add(1)
		go worker(jobChan, &wg)
	}

	close(jobChan)
	wg.Wait()
}

func worker(data chan *Data, wg *sync.WaitGroup) {
	defer wg.Done()
	for v := range data {
		// 数据处理代码
		go func() {
			out := fmt.Sprintf("id=%d,name=%s,age=%d", v.ID, v.Name, v.Age)
			fmt.Println(out)
		}()
	}
	fmt.Println("DONE")
}

func main() {

	data := make([]*Data, 0)
	for i := 0; i < 100; i++ {
		data = append(data, &Data{
			ID:   i,
			Name: "Zhangsan_" + strconv.Itoa(i),
			Age:  18 + i,
		})
	}

	syncRun(data)
}