Rumah >pembangunan bahagian belakang >Golang >Mengapa Membaca Dari Fail Sementara Go Gagal Sejurus Selepas Menulis?

Mengapa Membaca Dari Fail Sementara Go Gagal Sejurus Selepas Menulis?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-01 05:58:09389semak imbas

Why Does Reading From a Go Temporary File Fail Immediately After Writing?

Menyelesaikan Isu Baca dalam Pengendalian Fail Sementara Go

Dalam Go, mengakses data daripada fail sementara serta-merta selepas menulis kepadanya boleh menjadi tersandung blok. Berikut ialah pecahan terperinci masalah dan penyelesaiannya:

Masalahnya:

ioutil.TempFile Go mencipta fail sementara, membukanya untuk membaca dan menulis. Walaupun data boleh berjaya ditulis ke fail ini, operasi baca seterusnya gagal. Ini kerana deskriptor fail menghala ke penghujung fail selepas menulis.

Penyelesaian:

Untuk membetulkan isu ini, deskriptor fail mesti dialihkan semula ke permulaan fail sebelum cuba membacanya. Ini boleh dicapai menggunakan kaedah Seek *os.File. Dengan menambahkan tmpFile.Seek(0, 0) sebelum operasi baca, penuding fail ditetapkan semula kepada permulaan fail.

Contoh Kod:

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

Pertimbangan Tambahan:

  • Fail Penutupan: Adalah penting untuk menutup fail sementara selepas digunakan untuk melepaskan sumber sistem. Pernyataan tangguh dalam contoh kod memastikan fail ditutup secara automatik apabila fungsi selesai, mengelakkan kebocoran sumber.
  • Pemadaman Fail: Memadamkan fail sementara juga merupakan langkah penting. Ini biasanya dikendalikan menggunakan os.Remove() selepas fail ditutup. Urutan pelaksanaan untuk penyata tangguh adalah penting, dengan panggilan Tutup mendahului panggilan Alih Keluar untuk memastikan pembersihan sistem yang betul.

Atas ialah kandungan terperinci Mengapa Membaca Dari Fail Sementara Go Gagal Sejurus Selepas Menulis?. 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