27

我希望我的应用显示:

press any key to exit ...

并在我按任意键时退出。

我怎样才能做到这一点?

注意:我已经用谷歌搜索了,但我发现的所有内容都需要Enter在最后按下。我想要类似Console.ReadKey()C# 的东西。

我正在运行 MS Windows。

4

7 回答 7

31

对于那些运行 UNIX 系统的人来说,这是一个最小的工作示例:

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    // disable input buffering
    exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
    // do not display entered characters on the screen
    exec.Command("stty", "-F", "/dev/tty", "-echo").Run()

    var b []byte = make([]byte, 1)
    for {
        os.Stdin.Read(b)
        fmt.Println("I got the byte", b, "("+string(b)+")")
    }
}
于 2013-06-24T15:06:06.070 回答
15

termbox-go是一个轻量级的 Go-native 包,它提供了一些基本的终端控制。包括以原始模式获取输入的能力(一次读取一个字符,没有默认的行缓冲行为)。

它在不同系统之间也具有相当好的兼容性。

键盘扩展了termbox -go 以提供一些额外的键盘功能,例如多键快捷键和序列。

于 2013-03-01T14:34:08.523 回答
11

go-termbox 是非常重量级的。它想接管整个终端窗口。例如,它在启动时清除屏幕,这可能不是您想要的。

我把它放在OSX上。只是一个小小的 getchar():

https://github.com/paulrademacher/climenu/blob/master/getchar.go

于 2015-08-14T21:10:28.337 回答
9

你可以使用这个库(我的):https ://github.com/eiannone/keyboard

这是获取单次击键的示例:

char, _, err := keyboard.GetSingleKey()
if (err != nil) {
    panic(err)
}
fmt.Printf("You pressed: %q\r\n", char)
于 2016-05-05T13:39:36.223 回答
2

您可以在原始模式下从终端读取单个按键。是一个应该为您的程序提供原始终端模式的包。抓住:它只是Linux。

于 2013-03-01T14:27:48.433 回答
1

试试这个 - http://play.golang.org/p/kg-QirlucY

只需阅读os.Stdin末尾的func main

于 2013-06-25T04:32:09.833 回答
1

包“golang.org/x/term”允许您将标准输入切换到原始模式以一次读取每个字节。

package main

import (
    "fmt"
    "os"

    "golang.org/x/term"
)

func main() {
    // switch stdin into 'raw' mode
    oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
    if err != nil {
        fmt.Println(err)
        return
    }
    defer term.Restore(int(os.Stdin.Fd()), oldState)

    b := make([]byte, 1)
    _, err = os.Stdin.Read(b)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("the char %q was hit", string(b[0]))
}
于 2022-01-07T21:52:56.280 回答