Rumah >pembangunan bahagian belakang >Golang >Mengapa Saya Tidak Boleh Membaca Data yang Baru Saya Tulis ke Fail Sementara dalam Go?

Mengapa Saya Tidak Boleh Membaca Data yang Baru Saya Tulis ke Fail Sementara dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-30 04:30:16757semak imbas

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

Cara Membaca Data Yang Baru Ditulis ke Fail Temp

Garis Masalah

Apabila mencuba untuk menulis data ke fail sementara dan kemudian membacanya dalam Go, pengguna mungkin menghadapi kesukaran. Walaupun berjaya menulis data pada fail, mendapatkan semula data itu kemudiannya terbukti sukar difahami.

Penyelesaian

Inti isu terletak pada cara ioutil.TempFile beroperasi. Fungsi ini mencipta fail sementara dan membukanya untuk membaca dan menulis. Akibatnya, penunjuk dalam fail diletakkan pada penghujung data selepas operasi tulis.

Untuk menangani cabaran ini, adalah perlu untuk mencari permulaan fail menggunakan *os.File.Seek sebelum mencuba untuk membaca daripadanya. Operasi ini menetapkan semula penuding kepada permulaan, membolehkan operasi baca seterusnya mengakses data bertulis.

Pelaksanaan

Sampel kod berikut menunjukkan pelaksanaan yang diperbetulkan:

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)
    }
}

Mengoptimumkan untuk Prestasi

Untuk prestasi optimum dalam penyelesaian di atas, pertimbangkan untuk menggunakan bait.Buffer dan bukannya fail sementara. Penampan ini boleh dihantar ke bufio.Reader untuk memudahkan pembacaan data.

Selain itu, gelung s.Scan() boleh digantikan dengan ioutil.ReadAll() untuk membaca semua data dengan cekap ke dalam bait hiris.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Membaca Data yang Baru Saya Tulis ke Fail Sementara dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn