The example below shows how to cancel a goroutine while is in the middle of executing a long-running task.
package main
import (
"context"
"fmt"
"time"
)
func main() {
busyChan := make(chan bool)
ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
for {
select {
case <-busyChan:
fmt.Println("Pretending to be very busy")
time.Sleep(5000 * time.Second)
case <-ctx.Done():
return
}
}
}(ctx)
busyChan <- true
fmt.Println("Doing some other things")
time.Sleep(3 * time.Second)
fmt.Println("Stopping the goroutine")
cancel()
}
Output:
Prentending to be very busy
Doing some other things
Stopping the goroutine