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

终端go应用程序中输入超时,go,Go,我正在尝试制作一个终端golang应用程序,其中用户有4秒钟的时间输入内容。如果他输入了更快的内容,打印结果并要求他再次输入4秒钟 如果用户在4秒钟内不返回输入,程序必须写入超时,并要求他再次输入 我的代码执行此操作,但只执行一次。在第一次超时后即使用户的速度超过4秒,也不会返回任何结果。我不明白为什么会这样 代码 package main import ( "bufio" "fmt" "log" "os" "time" ) var ( res

我正在尝试制作一个终端
golang
应用程序,其中用户有4秒钟的时间输入内容。如果他输入了更快的内容,打印结果并要求他再次输入4秒钟

如果用户在4秒钟内不返回输入,程序必须写入
超时
,并要求他再次输入

我的代码执行此操作,但只执行一次。在第一次
超时后
即使用户的速度超过4秒,也不会返回任何结果。我不明白为什么会这样

代码

package main

import (
    "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")
        }
    }
}

问题与您获取用户输入的方式有关。在超时时,您会生成一个新的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")
        }
    }
}
func getInput(输入字符串){
为了{
in:=bufio.NewReader(os.Stdin)
结果,错误:=in.ReadString('\n')
如果错误!=零{
log.Fatal(错误)
}
输入
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")
        }
    }
}