发生状况时停止读取频道的最佳方法

I have a go routine that keeps blocked until a channel receives new data. However, I need to stop the go routine whenever a condition is true. I wonder what is the best way to do this.

I will illustrate the problem with an example code. The first solution I thought was using a select statement and check the condition constantly, like this:

func routine(c chan string, shouldStop func() bool) {
    select {
    case s := <-c:
        doStuff(s)
    default:
        if shouldStop() {
            return
        }
    }
}

However, this approach will force the routine to call shouldStop() every time and never block. I thought this could lead to performance problems, specially because there a lot others routines running.

Another option would be to use a sleep to at least block a little between shouldStop() calls. However, this would not be a perfect solution, since I'd like to call doStuff() in the exact time the channel receives with new data

Lastly, I thought about using a second channel just to achieve this, like:

func routine(c chan string, stop chan bool) {
    select {
    case s := <-c:
        doStuff(s)
    case b := <-stop:
        return
    }
}

While I thought that this might work, this would force me to have an extra channel along with the shouldStop flag. Maybe there is a better solution I'm not aware of.

Any suggestion is appreciated. Thanks.