Inhaltsverzeichnis
Lesen Sie die Standardeingabe global
Lesen Sie die Standardeingabe Zeile für Zeile
Zu beachtende Dinge und Best Practices
Zusammenfassen
Heim Backend-Entwicklung Golang Eine praktische Anleitung zum effizienten Lesen der Standardeingabe (stdin) in der Go-Sprache

Eine praktische Anleitung zum effizienten Lesen der Standardeingabe (stdin) in der Go-Sprache

Oct 09, 2025 am 02:21 AM

Eine praktische Anleitung zum effizienten Lesen der Standardeingabe (stdin) in der Go-Sprache

Dieser Artikel soll eine praktische Anleitung zum Lesen der Standardeingabe (stdin) in der Go-Sprache bieten. Wir werden zwei Hauptmethoden untersuchen: die Verwendung von io.ReadAll, um alle Eingaben auf einmal zu lesen, und die Verwendung von bufio.Scanner, um die Eingabe Zeile für Zeile zu verarbeiten. Gleichzeitig werden in dem Artikel häufige Missverständnisse über os.Stdin.Stat().Size() geklärt und entsprechende Codebeispiele und Vorsichtsmaßnahmen bereitgestellt, um Entwicklern bei der Auswahl der am besten geeigneten Eingabeverarbeitungsstrategie für verschiedene Szenarien zu helfen.

In der Go-Sprache erfolgt der Zugriff auf die Standardeingabe (stdin) normalerweise über das os.Stdin-Objekt. Unabhängig davon, ob Sie Eingaben von Pipes, Dateiumleitungen oder interaktiven Terminals erhalten, bietet os.Stdin eine einheitliche Schnittstelle. Um robuste Go-Programme zu schreiben, ist es von grundlegender Bedeutung, zu verstehen, wie mit diesen Eingaben richtig und effizient umgegangen wird.

Lesen Sie die Standardeingabe global

Die Funktion io.ReadAll ist eine prägnante und leistungsstarke Wahl, wenn Sie alle verfügbaren Standardeingaben auf einmal lesen müssen. Es liest alle Daten aus dem bereitgestellten io.Reader (hier os.Stdin), bis ein Dateiendezeichen (EOF) auftritt oder ein Fehler auftritt.

Beispielcode:

 Paket main

importieren (
    „io“
    "Protokoll"
    „os“
)

func main() {
    // Verwenden Sie io.ReadAll, um den gesamten Inhalt von os.Stdin-Bytes zu lesen, err := io.ReadAll(os.Stdin)

    // Prüfen, ob beim Lesen ein Fehler auftritt if err != nil {
        log.Fatalf("Standardeingabe konnte nicht gelesen werden: %v", err)
    }

    //Drucken Sie die Anzahl der gelesenen Bytes und den Inhalt log.Printf("Read %d bytes, content: %s", len(bytes), string(bytes))
}

Ausführen und testen:

Angenommen, der obige Code ist als read_stdin.go gespeichert.

  1. Eingabe über Pipe:

     echo „Hallo los, stdin!“ | Führen Sie read_stdin.go aus

    Ausgabebeispiel:

     27.10.2023 10:00:00 16 Bytes gelesen, Inhalt: Hallo Go stdin!
  2. Eingabe über eine Datei umleiten: Erstellen Sie eine input.txt-Datei mit dem Inhalt „This is from a file“.

     Führen Sie read_stdin.go <input.txt aus><p> Ausgabebeispiel:</p>
    <pre class="brush:php;toolbar:false"> 27.10.2023 10:00:00 23 Bytes wurden gelesen, Inhalt: Dies ist aus einer Datei.
  3. Interaktiver Input:

     Führen Sie read_stdin.go aus

    Das Programm wartet auf Benutzereingaben. Drücken Sie nach Eingabe des Inhalts Strg D (Unix/Linux/macOS) oder Strg Z und drücken Sie die Eingabetaste (Windows), um EOF zu senden. Das Programm verarbeitet die Eingabe und wird beendet.

Klarstellung zu os.Stdin.Stat().Size():

Beim Umgang mit Standardeingaben versuchen Entwickler manchmal, os.Stdin.Stat().Size() zu verwenden, um die Größe der Eingabe vorherzusagen. Dies führt jedoch häufig zu Missverständnissen, da es sich bei os.Stdin häufig nicht um eine reguläre Datei handelt. Stat().Size() gibt normalerweise 0 zurück, wenn die Standardeingabe eine Pipe oder ein Terminal ist. Dies liegt daran, dass Pipes und Terminals Streaming-Geräte sind, deren Datengröße bis zum Lesen unbekannt ist, und sie keine Eigenschaften mit fester Größe wie Festplattendateien haben. Daher sollte man sich nicht auf Stat().Size() verlassen, um festzustellen, ob Daten in der Standardeingabe vorhanden sind oder deren genaue Größe. Der richtige Ansatz besteht darin, zu versuchen, eventuell auftretende EOF oder Fehler direkt zu lesen und zu behandeln.

Lesen Sie die Standardeingabe Zeile für Zeile

Für Szenarien, die eine zeilenweise Verarbeitung von Eingabedaten erfordern, wie z. B. die Verarbeitung von Konfigurationsdateien, Protokolldateien oder Befehlszeileninteraktionen, bietet bufio.Scanner eine bequemere und effizientere Schnittstelle. Es bietet die Möglichkeit, Eingaben zu puffern und zeilenweise (oder nach einem anderen benutzerdefinierten Trennzeichen) zu scannen.

Beispielcode:

 Paket main

importieren (
    „bufio“
    "Protokoll"
    „os“
)

func main() {
    // Einen neuen Scanner erstellen und den Scanner aus os.Stdin lesen := bufio.NewScanner(os.Stdin)

    // Jede Zeile durchlaufen für scanner.Scan() {
        line := scanner.Text() // Den Text der aktuellen Zeile abrufen log.Printf("Zeile lesen: %s", Zeile)
    }

    // Prüfen, ob beim Scannen ein Fehler aufgetreten ist (EOF ist kein Fehler)
    if err := scanner.Err(); ähm != null {
        log.Fatalf("Standardeingabe konnte nicht gescannt werden: %v", err)
    }
}

Ausführen und testen:

Angenommen, der obige Code ist als scan_stdin.go gespeichert.

  1. Mehrlinienrohreingabe:

     echo -e "Zeile eins\nZeile zwei\nZeile drei" | Führen Sie scan_stdin.go aus

    Ausgabebeispiel:

     27.10.2023 10:00:00 Eine Zeile lesen: Zeile eins
    27.10.2023 10:00:00 Eine Zeile lesen: Zeile zwei
    27.10.2023 10:00:00 Eine Zeile lesen: Zeile drei
  2. Interaktiver Input:

     Führen Sie scan_stdin.go aus

    Das Programm wartet auf Benutzereingaben. Jedes Mal, wenn Sie eine Zeile eingeben und die Eingabetaste drücken, verarbeitet das Programm diese Zeile. Drücken Sie Strg D (Unix/Linux/macOS) oder Strg Z und drücken Sie die Eingabetaste (Windows), um die Eingabe zu beenden.

Zu beachtende Dinge und Best Practices

  • Fehlerbehandlung: Unabhängig davon, ob Sie io.ReadAll oder bufio.Scanner verwenden, prüfen Sie immer, ob zurückgegebene Fehler vorliegen. Dies ist entscheidend für die Identifizierung von Problemen mit der Eingabequelle (z. B. unzureichende Berechtigungen, E/A-Fehler).
  • Blockierendes Verhalten: Der Lesevorgang von os.Stdin blockiert. Wenn in der Standardeingabe keine Daten vorhanden sind, wartet das Programm, bis Daten verfügbar sind oder EOF auftritt. In komplexen Szenarien, die nicht blockierende Lese- oder Timeout-Mechanismen erfordern, kann es erforderlich sein, Goroutine und Context zu kombinieren, um dies zu erreichen.
  • Wählen Sie das richtige Werkzeug:
    • io.ReadAll eignet sich für Szenarien, in denen die Eingabemenge nicht groß ist und alle Inhalte auf einmal abgerufen werden müssen. Lesen Sie beispielsweise eine kurze Konfigurationszeichenfolge oder einzeilige Befehlsparameter.
    • bufio.Scanner eignet sich für Szenarien, in denen eine große Menge an Eingaben Zeile für Zeile verarbeitet werden muss oder es sich bei der Eingabe um mehrzeiligen Text handelt. Im Hinblick auf Speichereffizienz und Verarbeitungslogik ist es besser, da nicht alles auf einmal in den Speicher geladen wird.
  • Speicherverbrauch: io.ReadAll lädt alle Eingaben in den Speicher. Wenn die Eingabe sehr groß ist, kann es zu einem Speicherüberlauf kommen. In diesem Fall sind bufio.Scanner oder andere Streaming-Lesemethoden wie io.Copy die bessere Wahl.
  • Benutzerdefiniertes Trennzeichen: bufio.Scanner kann nicht nur zeilenweise scannen, sondern auch die Trennzeichenfunktion über die Methode scanner.Split() anpassen, um nach Wörtern, Bytes oder anderen beliebigen Trennzeichen zu scannen.

Zusammenfassen

Die Go-Sprache bietet einen flexiblen und leistungsstarken Mechanismus zur Verarbeitung von Standardeingaben. Über io.ReadAll können Sie problemlos alle Eingabeinhalte auf einmal abrufen, was für kleine und allgemeine Eingaben geeignet ist. Bufio.Scanner bietet eine effiziente und speicherfreundliche Lösung für die Verarbeitung großer Mengen an Streaming-Eingaben Zeile für Zeile oder mit benutzerdefinierten Trennzeichen. Das Verständnis der Eigenschaften von os.Stdin als Streaming-Gerät, insbesondere im Hinblick auf das Verhalten von Stat().Size(), kann Entwicklern dabei helfen, häufige Fallstricke zu vermeiden. Abhängig vom spezifischen Anwendungsszenario und Datenvolumen ist die Wahl einer geeigneten Lesestrategie in Kombination mit einer vollständigen Fehlerbehandlung der Schlüssel zum Schreiben effizienter und robuster Go-Programme.

Das obige ist der detaillierte Inhalt vonEine praktische Anleitung zum effizienten Lesen der Standardeingabe (stdin) in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Stock Market GPT

Stock Market GPT

KI-gestützte Anlageforschung für intelligentere Entscheidungen

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Was ist die leere Struktur {} in Golang verwendet? Was ist die leere Struktur {} in Golang verwendet? Sep 18, 2025 am 05:47 AM

Struct {} ist eine feldlose Struktur in GO, die Null -Bytes einnimmt und häufig in Szenarien verwendet wird, in denen Daten nicht erforderlich sind. Es wird als Signal im Kanal verwendet, wie z. B. Goroutine -Synchronisation; 2. als Sammlung von Werttypen von Karten, um wichtige Existenzüberprüfungen im effizienten Speicher zu durchführen; 3.. Definierbare Empfänger der staatenlosen Methoden, geeignet für Abhängigkeitsinjektion oder Organisationsfunktionen. Dieser Typ wird häufig verwendet, um den Kontrollfluss und klare Absichten auszudrücken.

GOE GO WebSocket EOF ERRAGE: Halten Sie die Verbindung aktiv GOE GO WebSocket EOF ERRAGE: Halten Sie die Verbindung aktiv Sep 16, 2025 pm 12:15 PM

Dieser Artikel zielt darauf ab, EOF-Fehler (End-of-File) -Fehlern bei der Entwicklung von WebSocket mit GO aufzutreten. Dieser Fehler tritt normalerweise auf, wenn der Server die Client -Meldung empfängt und die Verbindung unerwartet geschlossen ist, was dazu führt, dass die nachfolgenden Nachrichten nicht normal zur Verfügung gestellt werden können. In diesem Artikel wird die Ursachen des Problems analysiert, Codebeispiele bereitgestellt und entsprechende Lösungen bereitgestellt, mit denen Entwickler stabile und zuverlässige WebSocket -Anwendungen aufbauen können.

Starten Sie einen externen Redakteur im GO -Programm und warten Sie, bis er abgeschlossen ist Starten Sie einen externen Redakteur im GO -Programm und warten Sie, bis er abgeschlossen ist Sep 16, 2025 pm 12:21 PM

In diesem Artikel wird beschrieben, wie ein externer Editor (z. B. VIM oder Nano) in einem GO -Programm startet und darauf wartet, dass der Benutzer den Editor schließt, bevor das Programm weiter ausführt. Durch Einstellen von CMD.stdin, CMD.Stdout und CMD.stderr kann der Editor mit dem Terminal interagieren, um das Problem des Startversagens zu lösen. Gleichzeitig wird ein vollständiges Codebeispiel angezeigt und Vorsichtsmaßnahmen werden vorgesehen, damit Entwickler diese Funktion reibungslos implementieren können.

Wie lesen und schreiben Sie Dateien in Golang? Wie lesen und schreiben Sie Dateien in Golang? Sep 21, 2025 am 01:59 AM

GoprovidessimpleandefficienpatriemingTheosandbufiPackages.toreadasmallFileEntirely, UseOS.Readfile, WHOLOADSTheContentintomemorySafelyAntomatomaticManateManateFileoperationen

Was sind Middleware im Kontext von Golang -Webservern? Was sind Middleware im Kontext von Golang -Webservern? Sep 16, 2025 am 02:16 AM

MiddleWareIntowebserversArfunctionsThatIntercepthttpRequestSeBeforeTheachTheHandler, ermöglicht ReusableCross-CuttingFunctionality;

So lesen Sie Konfiguration aus Dateien in Golang So lesen Sie Konfiguration aus Dateien in Golang Sep 18, 2025 am 05:26 AM

Verwenden Sie das Coding/JSON -Paket der Standardbibliothek, um die JSON -Konfigurationsdatei zu lesen. 2. Verwenden Sie die Bibliothek gopkg.in/yaml.v3, um die Konfiguration der YAML -Format zu lesen. 3.. Verwenden Sie die Bibliothek os.getenv oder Godotenv, um die Dateikonfiguration zu überschreiben. V. Es ist erforderlich, die Struktur zu definieren, um die Sicherheit der Type zu gewährleisten, Datei- und Parsenfehler ordnungsgemäß zu behandeln, die Felder für Struktur-Tag-Zuordnung korrekt zu verwenden, hart codierte Pfade zu vermeiden und zu empfehlen, Umgebungsvariablen oder sichere Konfigurationsspeicher in der Produktionsumgebung zu verwenden. Es kann mit einfachem JSON beginnen und in Viper migrieren, wenn die Anforderungen komplex sind.

Go Language CFB -Modusverschlüsselung: Lösen Go Language CFB -Modusverschlüsselung: Lösen Sep 16, 2025 pm 12:30 PM

Dieser Artikel soll den Entwicklern helfen, Null -Zeiger -Ausnahmen zu verstehen und zu lösen, die durch die XorkeyStream -Funktion verursacht werden, die bei der Verwendung des CFB -Modus (Cipher Feedback) für AES -Verschlüsselung möglicherweise auftritt. Stellen Sie sicher, dass der Verschlüsselungsprozess reibungslos verläuft, indem die häufigsten Ursachen für Fehler analysiert und die korrekten Codebeispiele vorgenommen werden. Der Fokus liegt auf der korrekten Verwendung von Initialisierungsvektoren (IVS) und der Bedeutung des Verständnisses der AES -Blockgröße.

So kompilieren Sie eine andere Architektur (Arm) So kompilieren Sie eine andere Architektur (Arm) Sep 16, 2025 am 12:27 AM

Um den Go -Code für ARM -Architektur zu kompilieren, legen Sie einfach die Umgebungsvariablen fest und verwenden Sie den Befehl Gubuild. 1. Setzen Sie GoOS = Linux und Goarch = Arm (32-Bit) oder ARM64 (64-Bit), um die Zielplattform anzugeben. 2. Optional set Goarm = 7 für 32-Bit-Arm, um den Anweisungssatz von ARMV7 anzugeben. 3. Wenn keine CGO erforderlich ist, setzen Sie CGO_Enabled = 0, um eine statische Verknüpfung zu gewährleisten. 4. Führen Sie den Befehl wie GoOS = LinuxGoarch = Arm64cgo_Enabled = 0Gobuild-omyApp-Arm64 aus, um eine binäre Datei zu generieren. 5. Kopieren Sie die generierte Binärdatei in ein ARM -Gerät (z. B. Raspber

See all articles