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.
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