Apabila pengaturcaraan dengan Golang, biasanya kita perlu membuka, membaca dan menulis fail. Walau bagaimanapun, pada masa yang sama, kami juga perlu memastikan bahawa kami menutup fail apabila kami selesai menggunakannya untuk mengosongkan sumber sistem. Oleh itu, artikel ini akan memperkenalkan cara menutup fail di Golang.
Di Golang, gunakan fungsi os.Open()
untuk membuka fail dan gunakan fungsi os.Create()
untuk mencipta fail baharu. Fungsi ini mengembalikan contoh jenis *File
. Apabila kita selesai menggunakannya, kita harus menggunakan fungsi file.Close()
untuk menutup fail untuk melepaskan sumber sistem Jika tidak, deskriptor fail akan bocor dan akhirnya keseluruhan sumber sistem akan digunakan.
Sebagai contoh, dalam contoh berikut, kami membuka fail dan mengulangi semua barisnya:
file, err := os.Open("example.txt") if err != nil { log.Fatal(err) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { log.Fatal(err) }
Perhatikan bahawa pernyataan defer
digunakan di sini, yang akan dilaksanakan secara automatik sebelum fungsi mengembalikan kaedah file.Close()
. Cara ini memastikan bahawa walaupun ralat berlaku dalam fungsi, fail akan ditutup dengan betul.
Kita boleh menggunakan kaedah file.Close()
untuk menutup fail. Walau bagaimanapun, kadangkala menutup fail boleh menjadi salah. Contohnya, dalam kod berikut, kami sengaja membuka fail yang tidak wujud:
file, err := os.Open("does_not_exist.txt") if err != nil { log.Fatal(err) } defer file.Close()
Memandangkan fail itu tidak wujud, ralat dikembalikan semasa membuka fail. Dalam kes ini, file.Close()
akan mencetuskan ralat lain, menyebabkan penutupan gagal. Dalam kes ini, kami perlu memastikan kami menyemak ralat sebelum menutup fail. Contohnya:
file, err := os.Open("does_not_exist.txt") if err != nil { log.Fatal(err) } defer func() { if err := file.Close(); err != nil { log.Fatal(err) } }()
Di sini, kami menggunakan fungsi tanpa nama dan meletakkan operasi penutupan fail dalam fungsi ini. Semasa fungsi sedang dilaksanakan, kami sekali lagi menyemak sama ada ralat berlaku semasa menutup fail. Jika penutupan gagal, kita boleh memanggil fungsi log.Fatal()
untuk log ralat dan keluar dari program.
Dalam pelaksanaan peringkat rendah, menutup fail hanyalah panggilan sistem pengendalian, memanggil fungsi sistem close()
untuk ditutup deskriptor fail. Di Golang, jenis os.File
melaksanakan antara muka io.Closer
, yang hanya mempunyai satu kaedah:
type Closer interface { Close() error }
Dalam os.File
, fungsi Close()
sebenarnya hanya memanggil fungsi syscall.Close()
.
func (file *File) Close() error { if file == nil { return syscall.EINVAL } if file == os.Stdin || file == os.Stdout || file == os.Stderr { return nil } return file.file.close() }
Perhatikan bahawa fungsi Close()
ini juga menyemak beberapa kes khas, seperti file
boleh menjadi nil
, atau strim input dan output standard khas. Dalam kes ini, operasi penutupan tidak benar-benar melakukan sebarang tindakan sebenar.
Adalah amalan pengaturcaraan yang baik untuk menggunakan kata kunci defer
semasa membuka fail. Dengan cara ini, kita boleh memastikan bahawa fail ditutup walaupun ralat berlaku sebelum fungsi kembali. Sebagai contoh, kod berikut akan menutup fail secara automatik selepas membacanya:
file, err := os.Open("example.txt") if err != nil { log.Fatal(err) } defer file.Close() // 读取文件
Memandangkan susunan pelaksanaan pernyataan defer
ialah "masuk terakhir dahulu", pada bila-bila masa sebelum fungsi kembali, kita boleh Pastikan fail ditutup.
Di Golang, gunakan fungsi os.Open()
untuk membuka fail dan gunakan kaedah file.Close()
untuk menutup fail untuk melepaskan sumber. Kita harus memastikan untuk menyemak ralat dan log mereka semasa menutup fail. Selain itu, menggunakan kata kunci defer
memastikan bahawa apabila fail digunakan dan dimanipulasi, ia sentiasa ditutup dengan betul.
Atas ialah kandungan terperinci golang tutup fail. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!