Дать горутине возможность выйти по условию: по каналу отмены (done), по контексту или по закрытию канала. Не убивать горутины принудительно. Дождаться выхода через WaitGroup, канал или errgroup.
done := make(chan struct{})
go func() { defer close(done); doWork() }()
// ...
<-done