


Eine praktische Anleitung zum effizienten Lesen der Standardeingabe (stdin) in der Go-Sprache
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.
-
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!
-
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.
-
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.
-
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
-
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!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Stock Market GPT
KI-gestützte Anlageforschung für intelligentere Entscheidungen

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

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.

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.

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.

GoprovidessimpleandefficienpatriemingTheosandbufiPackages.toreadasmallFileEntirely, UseOS.Readfile, WHOLOADSTheContentintomemorySafelyAntomatomaticManateManateFileoperationen

MiddleWareIntowebserversArfunctionsThatIntercepthttpRequestSeBeforeTheachTheHandler, ermöglicht ReusableCross-CuttingFunctionality;

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.

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.

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
