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

从Go中的标准输入读取字符(不按Enter键),go,stdin,Go,Stdin,我希望我的应用程序显示: 按任意键退出… 当我按下任意键时,它退出 我怎样才能做到这一点 注意:我已经在谷歌上搜索过了,但我找到的所有内容都需要在最后按enter键。我想要类似C#中的Console.ReadKey() 我正在运行MS Windows。您可以在原始模式下从终端读取单个按键。是一个应该为程序提供原始终端模式的包。注意:它仅限于Linux。是一个轻量级的Go-native包,提供一些基本的终端控制。包括在原始模式下获取输入的能力(一次读取一个字符,而不使用默认的行缓冲行为) 它在不同

我希望我的应用程序显示:

按任意键退出…

当我按下任意键时,它退出

我怎样才能做到这一点

注意:我已经在谷歌上搜索过了,但我找到的所有内容都需要在最后按enter键。我想要类似C#中的
Console.ReadKey()


我正在运行MS Windows。

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

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

它在不同系统之间的兼容性也相当不错


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

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


只需从
func main
末尾的
os.Stdin
读取即可,go Term框非常重。它想接管整个终端窗口。例如,它会在启动时清除屏幕,这可能不是您想要的

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


您可以使用这个库(我的):

这是一个获得单个击键的示例:

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

@jnml No的可能副本;这不是复制品。我以前见过这个问题,使用答案中提供的代码,您仍然需要在stdin中按enter键。口是心非只是关于这个问题,而不是关于它的任何答案。@jnml谢谢;我已经更改了标题。如何将输入的字符重新显示在屏幕上?Ibolit:示例中已经显示了这些字符。要仅显示字符,
fmt.Print(string(b))
应该可以工作。这不是原始模式的定义。此代码演示了如何使用
SetConsoleMode
。如果希望“按Enter键继续”,则
os.Stdin.Read([]字节{0})
就足够了。它也可以在linux上工作,但它从终端而不是Stdin(可能是管道)读取