How to kill a goroutine
yourbasic.org/golang
One goroutine can't forcibly stop another.
To make a goroutine stoppable, let it listen for a stop signal on a dedicated quit channel, and check this channel at suitable points in your goroutine.
quit := make(chan bool)
go func() {
for {
select {
case <-quit:
return
default:
// …
}
}
}()
// …
quit <- true
Here is a more complete example, where we use a single channel for both data and signalling.
// Generator returns a channel that produces the numbers 1, 2, 3,…
// To stop the underlying goroutine, send a number on this channel.
func Generator() chan int {
ch := make(chan int)
go func() {
n := 1
for {
select {
case ch <- n:
n++
case <-ch:
return
}
}
}()
return ch
}
func main() {
number := Generator()
fmt.Println(<-number)
fmt.Println(<-number)
number <- 0 // stops underlying goroutine
fmt.Println(<-number) // error, no one is sending anymore
// …
}
1
2
fatal error: all goroutines are asleep - deadlock!