2013-03-01 11 views
12

Voglio la mia applicazione mostra:Leggere un carattere dallo standard input in Go (senza premere Invio)

press any key to exit ...

E quando ho premuto un tasto qualsiasi , esce.

Come posso ottenere questo risultato?

Nota: ho cercato su Google, ma tutto quello che ho trovato necessario per premere immettere alla fine. Voglio qualcosa come Console.ReadKey() in C#.

Sono in esecuzione su MS Windows.

+3

possibile duplicato di [ Funzione Golang simile a getchar] (http://stackoverflow.com/questions/14094190/golang-function-similar-to-getchar) – zzzz

+1

@jnml No; questo non è un duplicato. Ho già visto questa domanda e utilizzando il codice fornito in risposta è ancora necessario premere Invio su stdin. –

+0

La duplicità riguarda esclusivamente la domanda, non la risposta. – zzzz

risposta

9

termbox-go è un pacchetto Go-native leggero che offre un controllo del terminale rudimentale. Compresa la possibilità di ottenere input in modalità raw (leggere un carattere alla volta senza il comportamento predefinito del buffer di riga).

Ha anche discretamente compatibilità tra diversi sistemi.

E keyboard estende termbox-go per fornire alcune funzionalità di tastiera aggiuntive come scorciatoie e sequenze multi-tasto.

+0

Questo non è ciò che la definizione di raw_mode è. – Awn

1

È possibile leggere un singolo tasto premuto da un terminale in modalità raw. Here è un pacchetto che dovrebbe fornire la modalità terminale raw al tuo programma. Catch: è solo Linux.

11

Questo è un esempio minimo di lavoro per coloro che esegue un sistema 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)+")") 
    } 
} 
+0

Come si ottiene il display i caratteri inseriti sullo schermo? – Ibolit

+0

Ibolit: sono già visualizzati nell'esempio. Per visualizzare solo i caratteri, 'fmt.Print (string (b))' dovrebbe funzionare. – blinry

3

si potrebbe usare questa libreria (la mia): https://github.com/eiannone/keyboard

Questo è un esempio per ottenere un solo tasto:

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