Envoi de frappes à un canal sans nouvelle ligne
Un besoin courant en programmation est d'envoyer des frappes à partir de l'entrée de l'utilisateur vers un canal en temps réel. temps. Cependant, par défaut, stdin est mis en tampon de ligne, ce qui signifie qu'il nécessite un caractère de nouvelle ligne pour déclencher toute entrée.
L'extrait de code que vous avez fourni :
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 }
tente d'y parvenir mais échoue en raison à la nature tampon de ligne de stdin. La méthode reader.ReadByte() se bloquera jusqu'à ce qu'une nouvelle ligne soit saisie.
Une solution, comme suggérée dans la réponse, consiste à utiliser ncurses, une bibliothèque qui fournit un ensemble de fonctions pour le contrôle du terminal. Ncurses vous permet de configurer le terminal pour passer en mode non tamponné, garantissant que chaque frappe est immédiatement envoyée au canal.
Une autre solution consiste à utiliser le package go-termbox, qui fournit une API de niveau supérieur. pour travailler avec les entrées et sorties sur le terminal. Avec go-termbox, vous pouvez obtenir une entrée sans tampon en appelant SetInputMode(InputEsc) avant de lire les entrées de l'utilisateur.
Pour les implémentations spécifiques à Linux, vous pouvez explorer la bibliothèque termios ou effectuer des appels système directs à l'aide du package syscall pour configurer le comportement du terminal. Les spécificités de la gestion par chaque plate-forme des entrées tamponnées et non tamponnées doivent être étudiées dans leur documentation ou leur code source respectif.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!