为了账号安全,请及时绑定邮箱和手机立即绑定

终端 go 应用程序中的输入超时

终端 go 应用程序中的输入超时

Go
慕雪6442864 2021-10-18 15:21:16
我正在尝试制作一个终端golang应用程序,用户有 4 秒的时间输入内容。如果他输入的更快,打印结果并让他再次输入 4 秒。如果用户不会在 4 秒内返回输入,程序必须编写time out并再次要求他输入。我的代码做到了这一点,但只有一次。在第一个之后,timeout即使用户在 4 秒内更快,它也不会返回任何结果。我不明白为什么会这样。编码package mainimport (    "bufio"    "fmt"    "log"    "os"    "time")var (    result string    err    error)func getInput(input chan string) {    in := bufio.NewReader(os.Stdin)    result, err := in.ReadString('\n')    if err != nil {        log.Fatal(err)    }    input <- result}func main() {    for {        fmt.Println("input something")        input := make(chan string, 1)        go getInput(input)        select {        case i := <-input:            fmt.Println("result")            fmt.Println(i)        case <-time.After(4000 * time.Millisecond):            fmt.Println("timed out")        }    }}输出:input something123result123input something2result2input somethingtimed outinput something2timed outinput somethingtimed outinput something
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

问题与您获取用户输入的方式有关。在超时时,您会生成一个新的 go 例程来请求输入,但是您之前生成的旧例程仍在那里获取输入并将其发送到一个没人再收听的频道。


将其更改为这样的内容可以解决问题:


func getInput(input chan string) {

    for {

        in := bufio.NewReader(os.Stdin)

        result, err := in.ReadString('\n')

        if err != nil {

            log.Fatal(err)

        }


        input <- result

    }

}


func main() {

    input := make(chan string, 1)

    go getInput(input)


    for {

        fmt.Println("input something")


        select {

        case i := <-input:

            fmt.Println("result")

            fmt.Println(i)

        case <-time.After(4000 * time.Millisecond):

            fmt.Println("timed out")

        }

    }

}


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信