Skip to content

Instantly share code, notes, and snippets.

@caioreix
Last active February 6, 2025 14:50
Show Gist options
  • Save caioreix/6a89f65c76e055ac2ee4afdfeff68c5b to your computer and use it in GitHub Desktop.
Save caioreix/6a89f65c76e055ac2ee4afdfeff68c5b to your computer and use it in GitHub Desktop.
Async Find With GORM
func getAllAsync[CH any](db *gorm.DB, pageSize int, ch chan<- *CH, wg *sync.WaitGroup, conds ...any) {
wg.Add(1)
defer close(ch)
defer wg.Done()
currentPage := 0
for {
rows := []*CH{}
_ = db.
Limit(pageSize).
Offset(currentPage*pageSize).
Find(&rows, conds...).Error
if len(rows) == 0 {
break
}
for _, row := range rows {
ch <- row
}
currentPage++
}
}
package main
func main() {
var (
pageSize = 10
wg = &sync.WaitGroup{}
rowChan = make(chan *map[string]any, pageSize)
)
go getAllAsync(db, pageSize, rowChan, wg)
wg.Add(1)
go func() {
defer wg.Done()
for row := range rowChan {
fmt.Println(row)
}
}()
wg.Wait()
fmt.Println("Done")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment