从Go中的标准输入读取一个字符(不按Enter键)

时间:2013-03-01 13:37:47

标签: go stdin

我想要我的应用节目:

press any key to exit ...

当我按任何键时,它会退出。

我怎样才能做到这一点?

注意:我已经使用Google搜索,但我发现的所有内容都需要在最后按输入。我想在C#中使用Console.ReadKey()之类的内容。

我正在运行MS Windows。

6 个答案:

答案 0 :(得分:17)

这是运行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)+")")
    }
}

答案 1 :(得分:11)

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

它在不同系统中的兼容性也相当不错。

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

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:5)

您可以使用此库(我的):{{3}}

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

char, _, err := keyboard.GetSingleKey()
if (err != nil) {
    panic(err)
}
fmt.Printf("You pressed: %q\r\n", char)

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

请阅读os.Stdin

末尾的func main