这是从控制台读取密钥的简便方法
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 并具有读取密钥的单位(模块)功能。但是依赖是真的有必要还是没有一种简单的方法可以做到这一点?可能甚至是一些推迟()技巧,我不知道。
答案 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
}
}