When you need to call multiple downstream systems, errgroup is a great way to express “do these in parallel, cancel on first failure.” The key is using errgroup.WithContext, not a plain WaitGroup, so the group can propagate cancellation. Each goroutine should select on ctx.Done() (or pass ctx into the client) and return early when canceled, otherwise you get tail-latency even after the request has already failed. I also like keeping results in separate variables and only reading them after g.Wait() returns nil. This avoids subtle data races and keeps the error path obvious. It’s a compact pattern that scales well for aggregate endpoints.