Rumah >pembangunan bahagian belakang >Golang >Mengapa Saya Tidak Boleh Membaca Data yang Baru Saya Tulis ke Fail Sementara dalam 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!