我的目的是按顺序打印字符串,当用户输入某个字符时,我们暂停该过程并读取标准输入内容。我知道可以捕获os.Interrupt信号,但我不知道如何在stdin中捕获事件。 我不想扫描并等待用户输入文字。当有按键事件时,该过程停止。
我的问题:如何在stdin上检测事件?
谢谢!
以下是您的建议的当前解决方案。 Go例程不构成最佳解决方案,因为您无法将它们作为线程进行管理。我目前正在继续努力,让你保持原状。 编辑:
func main() {
quit := make(chan bool)
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text())
fmt.Println("-----------------")
fmt.Println("Go routine running :", runtime.NumGoroutine())
go func() {
select {
case <-quit:
return
default:
fmt.Println("Text received and changed")
fmt.Println("-----------------")
for {
timer := time.NewTimer(time.Second * 1)
<-timer.C
fmt.Println(scanner.Text())
}
}
fmt.Println("Routine closed")
}()
}
if scanner.Err() != nil {
quit <- false
}
}
否则,如果我按照你的解决方案@varius:
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
for {
timer := time.NewTimer(time.Second * 1)
<-timer.C
fmt.Println(scanner.Text())
}
}
if scanner.Err() != nil {
/*handle error*/
}
}
但是我无法在程序运行时更改扫描内容。
答案 0 :(得分:1)
不知道它是否会回答您的问题,但对于那些想要确定单个按键而没有 enter
键的人,如下所示:
$ go run . <enter>
Key press => a
Key press => b
Key press => c
Key press => d
Key press => e
... (ctrl+c)
signal: interrupt
mattn 的模块 github.com/mattn/go-tty
可能会有所帮助。
package main
import (
"fmt"
"log"
"github.com/mattn/go-tty"
)
func main() {
tty, err := tty.Open()
if err != nil {
log.Fatal(err)
}
defer tty.Close()
for {
r, err := tty.ReadRune()
if err != nil {
log.Fatal(err)
}
fmt.Println("Key press => " + string(r))
}
}
// go.mod
module sample/tty
go 1.16
require github.com/mattn/go-tty v0.0.3 // indirect