Como sinalizar para uma goroutine parar de correr?

Estou tentando interromper uma rotina de ir, mas não consigo encontrar uma maneira de conseguir isso. Eu estava pensando em usar um segundo canal, mas se eu ler a partir disso ele iria bloquear, não é? Aqui está um código que, espero, explica o que estou tentando fazer.

package main

import "fmt"
import "time"

func main() {

    var tooLate bool

    proCh := make(chan string)

    go func() {
        for {
               fmt.Println("working")
        //if is tooLate we stop/return it
            if tooLate { 
            fmt.Println("stopped")
                return
            }
       //processing some data and send the result on proCh
            time.Sleep(2 * time.Second)
            proCh <- "processed"
            fmt.Println("done here")

        }
    }()
    select {
    case proc := <-proCh:
        fmt.Println(proc)
    case <-time.After(1 * time.Second):
        // somehow send tooLate <- true
        //so that we can stop the go routine running
        fmt.Println("too late")
    }

    time.Sleep(4 * time.Second)
    fmt.Println("finish\n")
}

Jogue essa coisa

questionAnswers(1)

yourAnswerToTheQuestion