Maison >développement back-end >Golang >Pourquoi ne puis-je pas lire les données que je viens d'écrire dans un fichier temporaire avec Go ?
Comment lire des données qui viennent d'être écrites dans un fichier temporaire
Aperçu du problème
Lors d'une tentative pour écrire des données dans un fichier temporaire puis les lire dans Go, les utilisateurs peuvent rencontrer des difficultés. Bien que les données aient été écrites avec succès dans le fichier, leur récupération s'avère ensuite insaisissable.
Solution
Le nœud du problème réside dans le fonctionnement d'ioutil.TempFile. Cette fonction crée un fichier temporaire et l'ouvre en lecture et en écriture. Par conséquent, le pointeur dans le fichier est positionné à la fin des données après l'opération d'écriture.
Pour relever ce défi, il est nécessaire de rechercher le début du fichier à l'aide de *os.File.Seek avant de tenter pour en lire. Cette opération réinitialise le pointeur au début, permettant à l'opération de lecture suivante d'accéder aux données écrites.
Implémentation
L'exemple de code suivant illustre l'implémentation corrigée :
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) } }
Optimisation des performances
Pour des performances optimales dans ce qui précède solution, envisagez d’utiliser un bytes.Buffer au lieu d’un fichier temporaire. Ce tampon peut être transmis à un bufio.Reader pour une lecture pratique des données.
De plus, la boucle s.Scan() peut être remplacée par ioutil.ReadAll() pour une lecture efficace de toutes les données dans un octet tranche.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!