Golang的主要新闻发布会

时间:2018-03-07 11:01:58

标签: go

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

但是我无法在程序运行时更改扫描内容。

1 个答案:

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