go获取数据库列表数据后,再通过go协程格式化数据

163 阅读1分钟
package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var gDb *gorm.DB

func main() {
	dsn := "root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
	gDb = db

	var r []map[string]interface{}
	result := db.Table("tb_users").Select("id", "name").Order("id DESC").Limit(10).Find(&r)
	if result.RowsAffected<1 {
		return
	}

	// 传递数据
	var chInData chan int
	chInData = make(chan int, 20)
	// 返回数据
	var chOutData chan map[string]interface{}
	chOutData = make(chan map[string]interface{}, 20)

	for _, v := range r {
		if id, ok := v["id"]; ok {
			chInData <- int(id.(uint64))
		}
	}
        // 关闭通道
	close(chInData)

        // 创建协程数量
	counter := 5
	for i := 0; i < counter; i++ {
		go getData(chInData, chOutData)
	}

        // 定义处理数据的数量,当处理完数据时,关闭通道
	var i int = 0
	var gData map[int64]map[string]interface{}
	gData = make(map[int64]map[string]interface{})
        // 接收通道数据
	for v := range chOutData {
		i++
		if id, ok := v["id"]; ok {
			k := int64(id.(uint64))
			gData[k] = v
		}
                // 当处理完指定的数据后,关闭通道
		if i == int(result.RowsAffected) {
			close(chOutData)
		}
	}
	
        // 格式化数据
	for k, v := range r {
		if id, ok := v["id"]; ok {
			k := int64(id.(uint64))
			v["ext"] = gData[k]
		}

		r[k] = v
	}

	fmt.Println(r)

}

func getData(chInData chan int, chOutData chan map[string]interface{}) {

	for v := range chInData {
		result := map[string]interface{}{}
		r := gDb.Table("tb_users").Select("id", "birthday").Where("id = ?", v).Take(&result)
		if r.RowsAffected > 0 {
			chOutData <- result
		}
	}
}