Go does not have a built-in DataLoader pattern; you must implement batching and caching manually using goroutines and channels. Create a batcher that collects requests over a short window, executes a single bulk query, and returns results to individual callers.
func BatchLoader(ctx context.Context, ids []string) ([]Result, error) {
// 1. Collect IDs from concurrent requests
// 2. Execute single DB query: SELECT * FROM table WHERE id IN (?)
// 3. Map results back to original request order
return db.Query(ctx, "SELECT * FROM items WHERE id IN (?)", ids)
}
Use a sync.Map or context.WithCancel to manage in-flight batches and prevent duplicate queries for the same IDs within a single request cycle.