2012-09-10 13 views
8

Chciałbym wysłać sekwencje klawiszy użytkownika do kanału bezpośrednio po każdym naciśnięciu klawisza na standardowe wejście.Wyślij sygnały stdin do kanału bez wymaganej nowej linii.

Podjęto próbę kodu poniżej, ale nie daje to pożądanego rezultatu, ponieważ metoda reader.ReadByte() blokuje do momentu wprowadzenia nowej linii.

func chars() <-chan byte { 
    ch := make(chan byte) 
    reader := bufio.NewReader(os.Stdin) 
    go func() { 
     for {   
      char, err := reader.ReadByte() 
      if err != nil { 
       log.Fatal(err) 
      } 
      ch <- char 
     } 
    }() 
    return ch 
} 

Dziękuję za wszelkie rady, w jaki sposób mogę uzyskać każdy znak wprowadzone przez użytkownika, aby przejść bezpośrednio do kanału bez konieczności znakiem nowej linii.

Odpowiedz

10

Stdin jest domyślnie buforowany liniowo. Oznacza to, że nie dostarczy ci żadnych danych wejściowych, dopóki nie zostanie napotkany znak nowej linii. To nie jest konkretna rzecz.

Mając to zachowanie w sposób bez buforowania jest wysoce zależna od platformy. Jak sugerował Rami, ncurses to sposób na zrobienie tego. Inną opcją jest znacznie lżejszy pakiet go-termbox.

Jeśli chcesz zrobić to wszystko ręcznie (przynajmniej na Linuksie), możesz spojrzeć na napisanie wiązań C dla termios lub zrobić syscalls bezpośrednio w Go.

Jak radzą sobie z tym platformy takie jak Windows, nie wiem. Możesz zagłębić się w kod źródłowy dla ncurses lub termbox, aby zobaczyć, jak to zrobili.

+0

Dzięki za informacje. Cieszę się, że zadałem to pytanie, bo inaczej bezskutecznie próbowałem sprawić, by działało to jeszcze dłużej. W każdym razie lubię sugestie termbox/ncurses, o których wspomnieliście wraz z Rami. Nigdy nie brałem pod uwagę tego podejścia, ale termbox w szczególności wydaje się bardzo przystępny i powinien robić dokładnie to, co chcę. – Kim

Powiązane problemy