如果在x秒内未按任何键,如何在Go中读取键,然后继续应用程序?

Ano*_*rog 0 ncurses go

这是从控制台读取密钥的简单方法

reader := bufio.NewReader(os.Stdin)

// ...

func readKey() rune {
    char, _, err := reader.ReadRune()
    if err != nil {
        fmt.Println("Error reading key: ", err)
    }
    return char
}

// ...

fmt.Println("Checking keyboard input...")    

loop:
for {
    keyb := readKey()
    switch keyb {
    case 'x':
      fmt.Println("x key pressed, exiting loop")
      break loop
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,问题在于应用程序始终等待读取密钥。如果您只想等待5秒钟才能读取密钥,而又没有读取密钥,则继续应用程序怎么办?

我在想,我可能必须引入一个依赖项,例如ncurses或turbopascal所具有的称为crt并具有readkey函数的单元(模块)。但是,依赖确实是必需的吗?或者是否有简单的方法可以做到?我什至不知道甚至有一些defer()技巧。

eug*_*ioy 5

您不需要外部依赖关系即可实现此目的。

您可以使用频道并在其上设置超时。

这是关于此的文档信息:https : //gobyexample.com/timeouts

关键部分是使输入在单独的goroutine中通过通道,以便主线程不会阻塞等待。然后,可以通过在select子句中设置超时来决定等待多长时间通过通道接收输入。

这是一个以您的帖子为基础的工作示例:

package main 

import (
    "bufio"
    "os"
    "log"
    "fmt"
    "time"
)

var reader = bufio.NewReader(os.Stdin)

func readKey(input chan rune) {
    char, _, err := reader.ReadRune()
    if err != nil {
        log.Fatal(err)
    }
    input <- char
}

func main() {
    input := make(chan rune, 1)
    fmt.Println("Checking keyboard input...")
    go readKey(input)
    select {
        case i := <-input:
            fmt.Printf("Input : %v\n", i)
        case <-time.After(5000 * time.Millisecond):
            fmt.Println("Time out!")
    }
}
Run Code Online (Sandbox Code Playgroud)