Heim >Backend-Entwicklung >Golang >Warum kann ich in Go keine Daten lesen, die ich gerade in eine temporäre Datei geschrieben habe?

Warum kann ich in Go keine Daten lesen, die ich gerade in eine temporäre Datei geschrieben habe?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-30 04:30:16757Durchsuche

Why Can't I Read Data I Just Wrote to a Temporary File in Go?

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!

Stellungnahme:
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