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
}
}
}