Heim >Backend-Entwicklung >Golang >Warum kann ich in Go keine Daten lesen, die ich gerade in eine temporäre Datei geschrieben habe?
So lesen Sie gerade in eine temporäre Datei geschriebene Daten
Problemübersicht
Beim Versuch Beim Schreiben von Daten in eine temporäre Datei und dem anschließenden Lesen in Go können Benutzer auf Schwierigkeiten stoßen. Trotz des erfolgreichen Schreibens der Daten in die Datei erweist sich das anschließende Abrufen als schwierig.
Lösung
Der Kern des Problems liegt in der Funktionsweise von ioutil.TempFile. Diese Funktion erstellt eine temporäre Datei und öffnet sie sowohl zum Lesen als auch zum Schreiben. Folglich wird der Zeiger innerhalb der Datei nach dem Schreibvorgang am Ende der Daten positioniert.
Um dieser Herausforderung zu begegnen, muss vor dem Versuch mit *os.File.Seek nach dem Anfang der Datei gesucht werden daraus lesen. Durch diesen Vorgang wird der Zeiger auf den Anfang zurückgesetzt, sodass der nachfolgende Lesevorgang auf die geschriebenen Daten zugreifen kann.
Implementierung
Das folgende Codebeispiel demonstriert die korrigierte Implementierung:
package main import ( "bufio" "fmt" "io/ioutil" "log" "os" "path/filepath" ) func main() { tmpFile, err := ioutil.TempFile("", fmt.Sprintf("%s-", filepath.Base(os.Args[0]))) if err != nil { log.Fatal("Could not create temporary file", err) } defer tmpFile.Close() fmt.Println("Created temp file: ", tmpFile.Name()) fmt.Println("Writing some data to the temp file") if _, err = tmpFile.WriteString("test data"); err != nil { log.Fatal("Unable to write to temporary file", err) } else { fmt.Println("Data should have been written") } fmt.Println("Trying to read the temp file now") // Seek the pointer to the beginning tmpFile.Seek(0, 0) s := bufio.NewScanner(tmpFile) for s.Scan() { fmt.Println(s.Text()) } if err = s.Err(); err != nil { log.Fatal("error reading temp file", err) } }
Optimierung für Leistung
Für optimale Leistung in den oben genannten Bereichen Lösung: Erwägen Sie die Verwendung eines bytes.Buffer anstelle einer temporären Datei. Dieser Puffer kann zum bequemen Lesen der Daten an einen bufio.Reader übergeben werden.
Zusätzlich kann die s.Scan()-Schleife durch ioutil.ReadAll() ersetzt werden, um alle Daten effizient in ein Byte einzulesen Scheibe.
Das obige ist der detaillierte Inhalt vonWarum kann ich in Go keine Daten lesen, die ich gerade in eine temporäre Datei geschrieben habe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!