You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:21:00