Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah ralat bahasa pergi?

Apakah ralat bahasa pergi?

青灯夜游
青灯夜游asal
2023-02-06 14:10:268455semak imbas

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.

Apakah ralat bahasa pergi?

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 pemalar
func 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"
Oleh itu, jenis asas EOF ialah struktur ralat.errorString Jenis struktur tidak menyokong pemalar penentuan. struktur errorString dan rentetan ralat yang sepadan dengan io.EOF ialah "EOF".

Kami boleh melaksanakan semula jenis ralat baharu dengan rentetan sebagai jenis asas untuk EOF:

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
}
Baharu ini io.errorString melaksanakan dua ciri: Pertama, ia memenuhi antara muka ralat ; Kedua, ia ditakrifkan semula berdasarkan jenis rentetan, jadi ia menyokong definisi pemalar Oleh itu, kita boleh mentakrifkan semula io.EOF sebagai pemalar berdasarkan errorString:

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!

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:apa itu goRealizeArtikel seterusnya:apa itu goRealize