2016-04-22 14 views
0

Ich mache es so, dass es nach Eingabe von CTRL-C fragt.Wie kann ich Reader.ReadString beenden, um auf Benutzereingaben zu warten?

Was ich zur Zeit habe, ist, dass eine separate Go-Routine, nach Empfang eines CTRL-C, den Wert einer Variablen ändert, so dass sie nicht nach einer anderen Zeile fragt. Ich finde jedoch keinen Weg um die aktuelle Linie herum.

d. H. Ich muss noch einmal Enter drücken, um aus der aktuellen Iteration des Lesens für \ n herauszukommen.

Gibt es vielleicht eine Möglichkeit, ein "\ n" in stdin für den Leser zu schieben.ReadString zu lesen. Oder eine Möglichkeit, die Ausführung ganz zu stoppen.

+0

Es gibt keine Möglichkeit, das Lesen von stdin zu unterbrechen, ohne einen Wert einzugeben. Sie müssen entweder den ausstehenden Lesevorgang belassen und ihn ignorieren oder einen neuen Lesevorgang erst dann starten, wenn Sie das gewünschte Ergebnis haben. – JimB

Antwort

0

Der einzige anständige Mechanismus, Gehen Sie zu fortfahren gibt, wenn entweder von zwei Dingen geschieht, ist select und select wählt nur auf Kanal liest, so ist Ihre einzige Option Ihr Signal-Handler goroutine ändern, um einen Kanal zu schreiben , und fügen Sie eine weitere goroutine hinzu, die stdin verarbeitet und Eingangszeilen an einen Kanal übergibt und dann auf den zwei Kanälen auswählt.

Dennoch bleibt Ihre Frage halb unbeantwortet: Ihr Hauptprogramm kann nicht mehr auf Eingabe auf einer Ctrl-C warten, aber die Goroutine, die die Eingabe liest, wartet immer noch auf Eingabe. In einigen Fällen ist das vielleicht in Ordnung ... wenn Sie nie wieder eine Standardeingabe benötigen oder wenn Sie genau so auf die Verarbeitungslinien zurückgehen. Aber wenn Sie etwas andere als ReadString von diesem Leser tun möchten, sind Sie fest ... buchstäblich. Die einzige Lösung, die ich sehe, wäre, Ihre eigene Zustandsmaschine um Read oder ReadByte zu schreiben, die in der Lage ist, ihr Verhalten als Reaktion auf externe Bedingungen zu ändern, aber das kann leicht schrecklich kompliziert werden.

Im Grunde sieht dies wie ein Fall aus, in dem Go die Dinge im Vergleich zum zugrundeliegenden System vereinfacht (keine Ausgabe wie EINTR, keine Auswahl auf Dateihandles), aber letztendlich weniger Strom für den Programmierer liefert.

+0

nicht sicher, wie dies im Code aussehen würde. Es ist immer noch mein erster Tag auf Go. –

Verwandte Themen