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!