golang tutup fail

WBOY
WBOYasal
2023-05-16 10:47:07683semak imbas

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.

Kepentingan menutup fail

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.

Ralat penutupan fail

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.

Pelaksanaan peringkat rendah os.File.Close()

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.

Tutup sumber melalui penangguhan

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.

Kesimpulan

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!

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
Artikel sebelumnya:golang xml modificationArtikel seterusnya:golang xml modification