如果在Go中没有按键,如何在Go中读取一个键但是继续应用?

时间:2017-05-14 15:15:14

标签: go ncurses

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

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
    }
}

但问题是应用程序总是等待读取密钥。如果您只想等待5秒钟读取密钥怎么办?如果没有读取密钥,请继续申请?

我认为我必须引入一种依赖关系,例如 ncurses 或turbopascal所谓的 crt 并具有读取密钥的单位(模块)功能。但是依赖是真的有必要还是没有一种简单的方法可以做到这一点?可能甚至是一些推迟()技巧,我不知道。

2 个答案:

答案 0 :(得分: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!")
    }
}

答案 1 :(得分:0)

可能最多&#34; go-isch&#34;这样做的方法是使用goroutine和渠道。你启动两个goroutine,一个等待输入,一个睡眠,直到超时后。然后,在主goroutine中使用select语句来检查首先发生的事件(输入或超时)。示例代码:

package main

import (
    "fmt"
    "time"
)

func waitForInput(didInput chan<- bool) {
    // Wait for a valid input here

    didInput <- true
}

func main() {
    didInput := make(chan bool, 1)
    timeout := make(chan bool, 1)

    go func() {
        time.Sleep(5 * time.Second)
        timeout <- true
    }()

    go waitForInput(didInput)

    select {
    case <-didInput:
        fmt.Println("")
        // Continue your application here
    case <-timeout:
        // Input timed out, quit your application here
    }
}