Angenommen, Sie möchten, dass sich ein Befehlszeilentool je nach vorhandener Eingabe auf STDIN unterschiedlich verhält. Die direkte Verwendung von ioutil.ReadAll(os.Stdin) kann jedoch zu unerwartetem Verhalten führen.
Insbesondere wenn das Tool ohne STDIN-Eingabe aufgerufen wird, wartet das Programm unbegrenzt auf eine Eingabe und verhindert so, dass es fortfahren kann weiter.
Um dieses Problem zu lösen, können Sie os.Stdin.Stat() verwenden, um zu überprüfen, ob die STDIN-Datei Deskriptor ist ein Zeichengerät. Der folgende Codeausschnitt zeigt, wie dies erreicht wird:
package main import ( "fmt" "os" ) func main() { stat, _ := os.Stdin.Stat() if (stat.Mode() & os.ModeCharDevice) == 0 { fmt.Println("data is being piped to stdin") } else { fmt.Println("stdin is from a terminal") } }
Wenn das ModeCharDevice-Flag für die STDIN-Datei gelöscht wird, bedeutet dies, dass Daten an die STDIN weitergeleitet werden. Andernfalls deutet es darauf hin, dass STDIN mit einem Terminal verbunden ist. Indem Sie dieses Flag überprüfen, können Sie feststellen, ob auf STDIN etwas zu lesen ist, ohne das Programm zu blockieren.
Das obige ist der detaillierte Inhalt vonWie kann ich lesbare Inhalte auf STDIN in Go ohne Blockierung erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!