Go语言程序无法重复读取标准输入,接收一次后即退出问题排查
问题原因
你的代码里的select语句仅执行一次——当第一个输入文本被读取并处理后,select就完成了执行,程序直接退出,不会继续监听后续的输入或者超时信号。
修复方案
把select放到一个无限循环中,这样程序会持续监听输入通道和超时通道,直到10秒超时信号触发才退出:
package main import ( "bufio" "fmt" "os" "time" ) func main() { input := make(chan string) abort := make(chan bool) // 10秒后发送退出信号 go func() { time.Sleep(10 * time.Second) abort <- true }() // 持续读取标准输入 go func() { cmd := bufio.NewScanner(os.Stdin) for cmd.Scan() { input <- "<- " + cmd.Text() } }() // 循环监听通道 for { select { case <-abort: fmt.Println("exiting") return case cmd := <-input: fmt.Println(cmd) } } }
关键改动说明
- 添加
for { ... }无限循环包裹select语句,让程序持续监听两个通道的信号 - 当收到
abort通道的信号时,执行return退出main函数,终止程序 - 每次收到输入信号并回显后,循环会回到
select,继续等待下一次输入或者超时信号
内容的提问来源于stack exchange,提问作者user219820
相关产品推荐
相关产品推荐

