Прочитайте символ со стандартного ввода в Go (без нажатия Enter)

Я хочу показать свои приложения:

press any key to exit ...

И когда я нажал любой ключ, он выйдет.

Как я могу это достичь?

Примечание. У меня есть googled, но все, что я нашел, нужно было нажать enter в конце. Я хочу что-то вроде Console.ReadKey() в С#.

Я запускаю MS Windows.

Ответ 1

termbox-go - это легкий пакет Go-native, который предлагает некоторые рудиментарные терминальные элементы управления. Включая возможность входа в режим raw (читайте по одному символу за раз без по умолчанию по умолчанию).

Он также имеет неплохую совместимость в разных системах.

И keyboard расширяет termbox-go, чтобы предоставить дополнительные функциональные возможности клавиатуры, такие как сочетания клавиш и последовательности клавиш.

Ответ 2

Это минимальный рабочий пример для тех, кто работает в системе 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)+")")
    }
}

Ответ 3

go-termbox очень тяжелый. Он хочет захватить все окно терминала. Например, он очищает экран при запуске, что может не соответствовать вашим ожиданиям.

Я положил это вместе на OSX. Просто крошечный getchar():

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

Ответ 4

Вы можете использовать эту библиотеку (мой): https://github.com/eiannone/keyboard

Это пример получения одного нажатия клавиши:

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

Ответ 5

Вы можете прочитать одно нажатие клавиши с терминала в необработанном режиме. Здесь - это пакет, который должен обеспечить исходный режим терминала для вашей программы. Catch: это только Linux.

Ответ 7

Я пробовал blinry код, но он не работает для меня. os.Stdin.Read(b) швы, чтобы по-прежнему требовался ключ возврата. Как я могу прочитать необработанный поток по одному байту за раз от стандартного в? Я понимаю, что клавиша со стрелкой будет 3 байта.