У меня есть программа, которая постоянно блокируется при чтении стандартного ввода, например:
func routine() {
for {
data := make([]byte, 8)
os.Stdin.Read(data);
otherChannel <-data
}
}
Подпрограмма ожидает чтения 8 байтов через стандартный ввод и передает другой канал.
Я хочуизящно прекратить эту программу из основного потока.Однако, поскольку программа почти всегда блокируется чтением со стандартного ввода, я не могу найти хорошее решение, чтобы заставить его остановиться.Я думал о чем-то вроде:
func routine(stopChannel chan struct{}) {
for {
select {
case <-stopChannel:
return
default:
data := make([]byte, 8)
os.Stdin.Read(data);
otherChannel <-data
}
}
}
Однако проблема в том, что если в stdin больше нет ввода, когда stopChannel
закрыто, программа будет заблокирована и не вернется.
Есть ли хороший подход, чтобы он сразу возвращался, когда хочет основной поток?
Спасибо.