Wie man von der Standardeingabe in Go liest: Vom Anfänger zum Profi
Haben Sie sich jemals gefragt, wie Sie Ihr Go-Programm dazu bringen, dem Benutzer zuzuhören? Wie schreibt man ein Dienstprogramm, das Befehle von der Konsole entgegennimmt, oder ein interaktives CLI-Tool? Wenn ja, sind Sie hier genau richtig. Heute werden wir das Lesen von der Standardeingabe (stdin) in Go so detailliert wie möglich behandeln.
Dieses Thema ist ein echter Hit auf Stack Overflow. Die Frage „How can I read from standard input in the console?“ hat tausende Aufrufe gesammelt. Und das zu Recht: Die Standardeingabe ist die Basis, ohne die kein ernsthaftes Go-Projekt auskommt. Wir passen diese Frage an das deutschsprachige Publikum an und verwandeln sie in ein vollwertiges Tutorial.
In diesem Artikel erfahren Sie:
- Was
os.Stdinist und wie man damit arbeitet - Wie man
bufio.Scannerfür zeilenweises Lesen verwendet - Warum
fmt.Scanein zweischneidiges Schwert ist - Wie man ganze Dateien von stdin liest
- Geheimnisse der Fehlerbehandlung und Leistung
Los geht's!
Was ist stdin und warum wird es in Go benötigt?
Die Standardeingabe (stdin) ist ein Datenstrom, den Ihr Programm von der Konsole oder von einem anderen Prozess erhält. In Go wird sie durch die Variable os.Stdin vom Typ *os.File dargestellt. Dies ist das Tor, durch das Daten in Ihr Programm gelangen.
Wozu wird das benötigt? Stellen Sie sich vor:
- Sie schreiben ein CLI-Dienstprogramm, das Benutzereingaben verarbeitet
- Sie erstellen einen Log-Parser, der Daten über eine Pipe liest (
cat log.txt | myapp) - Sie müssen eine interaktive Eingabe mit Hinweisen implementieren
Go, als Sprache für die Systemprogrammierung, bietet elegante Werkzeuge für die Arbeit mit stdin. Lassen Sie uns diese der Reihe nach durchgehen.
Methode 1: bufio.Scanner – Der König des zeilenweisen Lesens
Die beliebteste und empfohlene Methode zum Lesen von stdin in Go ist bufio.Scanner. Sie ist einfach, effizient und löst 90% der Aufgaben.
So sieht ein klassisches Beispiel aus:
package main
import ( "bufio" "fmt" "os")
func main() { scanner := bufio.NewScanner(os.Stdin) fmt.Println("Geben Sie Text ein (Strg+D zum Beenden):") for scanner.Scan() { line := scanner.Text() fmt.Println("Sie haben eingegeben:", line) } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "Lesefehler:", err) }}Wie funktioniert das?
bufio.NewScanner(os.Stdin)– erstellt einen Scanner, der von der Standardeingabe liestscanner.Scan()– gibttruezurück, solange Daten vorhanden sind (standardmäßig bis zum Zeilenumbruchzeichen)scanner.Text()– gibt die aktuelle Zeile ohne das-Zeichen zurück- Die Schleife wird bei
EOFunterbrochen (Strg+D unter Linux/Mac, Strg+Z unter Windows)
Dieser Code ist die Basis für jede Konsoleneingabe in Go. Er funktioniert hervorragend mit Pipes und interaktiver Eingabe.
Anpassung des Scanners
Standardmäßig teilt der Scanner die Eingabe nach Zeilen. Sie können dies jedoch ändern:
// Lesen nach Wörternscanner.Split(bufio.ScanWords)
// Lesen nach Bytesscanner.Split(bufio.ScanBytes)
// Lesen nach Zeichen (Runes)scanner.Split(bufio.ScanRunes)Sie können auch einen eigenen Splitter definieren – zum Beispiel für CSV oder benutzerdefinierte Trennzeichen. Aber das ist ein Thema für einen separaten Artikel.
Methode 2: fmt.Scan – Schnell und schmutzig
Wenn Sie einen einzelnen Wert eingeben müssen – eine Zahl, eine Zeichenkette oder mehrere Variablen – hilft fmt.Scan. Es ist wie scanf in C, nur