gpt4 book ai didi

go - 如何检测按键事件

转载 作者:行者123 更新时间:2023-12-04 13:45:28 30 4
gpt4 key购买 nike

我的目的是按顺序打印字符串,当用户输入某个字符时,我们暂停该过程并读取标准输入内容。我知道可以捕获 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*/
}
}
但我无法在程序运行时更改扫描内容。

最佳答案

不知道它是否会回答您的问题,但 对于那些想要确定单个按键的人,没有 enter key ,如下图:

$ go run . <enter>
Key press => a
Key press => b
Key press => c
Key press => d
Key press => e
... (ctrl+c)
signal: interrupt
模块 github.com/mattn/go-tty来自 mattn可能有帮助。
  • https://github.com/mattn/go-tty作者:mattn @ GitHub

  • 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
  • 测试:
  • 英特尔酷睿 i5,2.7 GHz 双核
  • macOS Catalina 10.15.7、Debian GNU/Linux 10 (buster)、Alpine Linux v3.13

  • 关于go - 如何检测按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49150316/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com