Если вы хотите, чтобы работник продолжал работать до тех пор, пока есть еще что-то, даже если сработал стоп, то реорганизуйте выбор:
out:
select {
case <-channel:
doWork()
for {
select {
case <- channel:
doWork()
default:
break out
}
}
case <-stop:
log.Printf("In Stop %v", len(channel))
return
}
}
Если вы закрываете канал, когда он пуст, тогда все, что вам нужно сделать это диапазон по каналу. Выше код будет работать, даже если вы не закрываете канал.