Goroutines are a unusual and powerful programming language feature, so they are a tempting toy to play with, and they get a bit overused. There is some indication that the following Go principle holds true: Strive to provide synchronous APIs, let the caller start goroutines. To put this advice into a more concrete code example: Do this: func (t *type) Run(ctx context.Context) { // Implementation of background task } Instead of this: func (t *type) Start() { t.wg.Add(1) go func() { // Implemen...