Dalam bahasa Go, eof merujuk kepada akhir ralat fail Ia adalah pembolehubah ralat yang paling penting dalam bahasa Go Ia wujud dalam pakej io dan digunakan untuk menunjukkan penghujung aliran input. Oleh kerana setiap fail mempunyai penghujung, "io.EOF" selalunya tidak dianggap sebagai ralat. Adalah lebih penting untuk menunjukkan penghujung aliran input.
Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.
ralat akhir fail (EOF) golang
Fungsi ini sering mengembalikan pelbagai ralat, yang boleh menjadi menarik hingga akhir pengguna, Tetapi untuk program, ini merumitkan keadaan. Banyak kali, program mesti bertindak balas secara berbeza bergantung pada jenis ralat. Mari kita pertimbangkan contoh:
membaca n bait daripada fail. Jika n adalah sama dengan panjang fail, sebarang ralat dalam proses membaca menunjukkan kegagalan. Jika n kurang daripada panjang fail, pemanggil akan berulang kali membaca data bersaiz tetap sehingga akhir fail. Ini menyebabkan pemanggil perlu mengendalikan pelbagai ralat yang disebabkan oleh akhir fail secara berasingan.
Atas sebab ini, io包
memastikan bahawa sebarang kegagalan baca yang disebabkan oleh akhir fail mengembalikan ralat yang sama - io.EOF, yang ditakrifkan dalam pakej io:
package io import "errors" // EOF is the error returned by Read when no more input is available. var EOF = errors.New("EOF")
Fahami io.EOF
io.EOF ialah pembolehubah dalam pakej io, yang menunjukkan ralat akhir fail:
package io23var EOF = errors.New("EOF")
Lihat juga dokumentasi terperinci melalui arahan berikut:
$ go doc io.EOF var EOF = errors.New("EOF") EOF is the error returned by Read when no more input is available. Functions should return EOF only to signal a graceful end of input. If the EOF occurs unexpectedly in a structured data stream, the appropriate error is either ErrUnexpectedEOF or some other error giving more detail. $
io.EOF mungkin pembolehubah ralat yang paling penting dalam bahasa Go. Ia digunakan untuk menunjukkan penghujung aliran input Kerana setiap fail mempunyai akhir, Oleh itu, io.EOF tidak dianggap sebagai ralat dalam banyak kes Adalah lebih penting untuk menunjukkan penghujung aliran input.
Kecacatan dalam reka bentuk io.EOF
Malangnya, reka bentuk io.EOF dalam perpustakaan standard adalah bermasalah , EOF ialah End- Singkatan daripada Of-File Menurut konvensyen bahasa Go, singkatan huruf besar secara amnya mewakili pemalar, io.EOF telah tersilap ditakrifkan sebagai pembolehubah, yang membawa kepada percambahan keizinan API kebenaran ialah reka bentuk mana-mana modul atau fungsi Keperluan tertinggi Dengan meminimumkan kebenaran, ralat yang tidak perlu dalam kod boleh ditemui seawal mungkin
Sebagai contoh, reka bentuk keselamatan yang penting bagi bahasa Go melarang penukaran jenis tersirat Oleh itu, dengan reka bentuk ini kita boleh dengan mudah Menemui pepijat dalam program Selain itu, bahasa Go melarang definisi pembolehubah tempatan yang tidak digunakan (kecuali parameter fungsi, jadi parameter fungsi adalah sebahagian daripada antara muka fungsi) dan melarang. import pakej yang tidak digunakan, yang merupakan amalan terbaik untuk meminimumkan kebenaran Reka bentuk kebenaran API minimum ini bukan sahaja meningkatkan kualiti program, tetapi juga meningkatkan prestasi alat penyusunan dan fail sasaran keluaran Oleh kerana EOF ditakrifkan sebagai pembolehubah, ini menyebabkan pembolehubah berniat jahat Tukar Kod berikut ialah cara yang elegan untuk menguburkan perangkap:
Walaupun ini adalah jenaka, ia benar-benar mendedahkan kecacatan reka bentuk. antara muka EOF: ia mempunyai risiko keselamatan yang serius. >io.EOF ditukar kepada pemalarfunc init() {2 io.EOF = nil3}
Idea penambahbaikan yang jelas ialah mentakrifkan io.EOF sebagai pemalar Walau bagaimanapun, kerana EOF sepadan dengan jenis antara muka ralat dan pemalar semasa sintaks bahasa Go tidak menyokong penentuan antara muka jenis tetap Tetapi kami Sekatan ini boleh dipintas melalui beberapa helah.Pemalar dalam bahasa Go mempunyai jenis utama bool/int/float/string/nil. . Pemalar bukan sahaja tidak termasuk jenis yang kompleks seperti antara muka, tetapi juga tatasusunan pemalar tidak disokong Walau bagaimanapun, terdapat peraturan lanjutan yang penting untuk pemalar: jenis baharu yang ditakrifkan dengan bool/int/float/string/nil! kerana jenis asas juga menyokong pemalar.Sebagai contoh, kami mentakrifkan semula jenis Rentetan aksara, ia juga boleh menyokong pemalar:
Dalam contoh ini, MyString ialah jenis yang baru ditakrifkan, dan pemalar jenis ini boleh ditakrifkan kerana jenis rentetan asasnya menyokong pemalar Jadi apakah jenis asas io.EOF ditakrifkan melalui ralat.New("EOF"). pelaksanaan fungsi ini:type MyString string2const name MyString = "chai2010"
package errors // New returns an error that formats as the given text. func New(text string) error { return &errorString{text} } // errorString is a trivial implementation of error. type errorString struct { s string } func (e *errorString) Error() string { return e.s }
Dengan cara ini, EOF menjadi pemalar yang boleh ditentukan pada jenis masa penyusunan, nilai pemalar masih rentetan "EOF" Tetapi ia juga membawa masalah baru: EOF bukan lagi jenis antara muka, adakah ia akan memusnahkan keserasian kod lama?
[Cadangan berkaitan: Pergi tutorial video, Pengajaran pengaturcaraan]
Atas ialah kandungan terperinci Apakah ralat bahasa pergi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!