In the Go language, eof refers to the end of file error. It is the most important error variable in the Go language. It exists in the io package and is used to indicate the end of the input stream. Because every file has an end, "io.EOF" is often not considered an error. It is more important to indicate the end of an input stream.
The operating environment of this tutorial: Windows 7 system, GO version 1.18, Dell G3 computer.
golang End of File Error (EOF)
Functions often return multiple errors, which can be interesting to end users, But for programs, this complicates the situation. Many times, programs must respond differently depending on the type of error. Let us consider an example:
Read n bytes from a file. If n is equal to the length of the file, any error in the reading process indicates failure. If n is less than the length of the file, the caller will repeatedly read fixed-size data until the end of the file. This results in the caller having to handle various errors caused by end-of-file separately.
For this reason, io package
ensures that any read failure caused by the end of the file returns the same error - io.EOF, which is defined in the io package:
package io import "errors" // EOF is the error returned by Read when no more input is available. var EOF = errors.New("EOF")
Understand io.EOF
io.EOF is a variable in the io package, indicating the end of file error:
package io23var EOF = errors.New("EOF")
Also view the detailed documentation through the following command:
$ 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 is probably the most important error variable in the Go language. It is used to indicate the end of the input stream. Because each file has an end, io.EOF is not an error in many cases, it is more important to indicate the end of an input stream.
Defects in the design of io.EOF
Unfortunately, the design of io.EOF in the standard library is problematic. First of all, EOF is End- The abbreviation of Of-File. According to the convention of Go language, capital letter abbreviations generally represent constants. Unfortunately, io.EOF was mistakenly defined as a variable, which led to the proliferation of API permissions. Minimizing API permissions is the design of any module or function. The highest requirement. By minimizing permissions, unnecessary errors in the code can be discovered as early as possible.
For example, an important security design of the Go language is to prohibit implicit type conversion. Therefore, with this design we can easily Discover bugs in the program. In addition, the Go language prohibits the definition of unused local variables (except function parameters, so function parameters are a part of the function interface) and prohibits the import of unused packages, which are best practices for minimizing permissions. The design of these minimum API permissions not only improves the quality of the program, but also improves the performance of the compilation tool and the output target file.
Because EOF is defined as a variable, this causes the variable to be maliciously Change. The following code is an elegant way to bury the trap:
func init() {2 io.EOF = nil3}
Although this is a joke, it truly exposes the design flaw of the EOF interface: it has serious security risks. Variable type It also seems to imply that users can safely modify the value of the variable. Therefore, EOF is an unsafe and elegant design.
io.EOF is changed to a constant
An obvious improvement idea is to define io.EOF as a constant. However, because EOF corresponds to an error interface type, and the current constant syntax of the Go language does not support defining interfaces of constant types. But we can pass There are some tricks to bypass this restriction.
The constants in Go language have the main types of bool/int/float/string/nil. Constants not only do not include complex types such as interfaces, but also arrays or structures of constants. Body is not supported! However, there is an important extension rule for constants: new types defined with bool/int/float/string/nil as the basic type also support constants.
For example, we redefine a string type , it can also support constants:
type MyString string2const name MyString = "chai2010"
In this example, MyString is a newly defined type, and constants of this type can be defined because its underlying string type supports constants.
So what is the underlying type of io.EOF? EOF is defined through errors.New("EOF"). The following is the implementation of this function:
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 }
So the underlying type of io.EOF is errors .errorString structure. The structure type does not support defining constants. However, there is only one string type in the errors.errorString structure, and the error string corresponding to io.EOF is "EOF".
We A new error type with string as the underlying type can be re-implemented for EOF:
package io type errorString string func (e errorString) Error() string { return string(e) }
This new io.errorString implements two characteristics: first, it satisfies the error interface; second, it is re-implemented based on the string type Definition, therefore supports the definition of constants. Therefore, we can redefine io.EOF as a constant based on errorString:
const EOF = errorString("EOF")
In this way, EOF becomes a constant type that can be determined at compile time, and the value of the constant is still "EOF" String. But it also brings new problems: EOF is no longer an interface type, will it destroy the compatibility of old code?
【Related recommendations: Go video tutorial, Programming teaching】
The above is the detailed content of What is the go language eof error?. For more information, please follow other related articles on the PHP Chinese website!

go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofmt使用tab进行缩进);gofmt工具会以标准样式的缩进和垂直对齐方式对源代码进行格式化,甚至必要情况下注释也会重新格式化。

go语言叫go的原因:想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,它们最大的特点就是挖洞速度特别快,当然可能不止是挖洞啦。

是,TiDB采用go语言编写。TiDB是一个分布式NewSQL数据库;它支持水平弹性扩展、ACID事务、标准SQL、MySQL语法和MySQL协议,具有数据强一致的高可用特性。TiDB架构中的PD储存了集群的元信息,如key在哪个TiKV节点;PD还负责集群的负载均衡以及数据分片等。PD通过内嵌etcd来支持数据分布和容错;PD采用go语言编写。

go语言能编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言。对Go语言程序进行编译的命令有两种:1、“go build”命令,可以将Go语言程序代码编译成二进制的可执行文件,但该二进制文件需要手动运行;2、“go run”命令,会在编译后直接运行Go语言程序,编译过程中会产生一个临时文件,但不会生成可执行文件。

go语言需要编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言,也就说Go语言程序在运行之前需要通过编译器生成二进制机器码(二进制的可执行文件),随后二进制文件才能在目标机器上运行。

删除map元素的两种方法:1、使用delete()函数从map中删除指定键值对,语法“delete(map, 键名)”;2、重新创建一个新的map对象,可以清空map中的所有元素,语法“var mapname map[keytype]valuetype”。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

SublimeText3 Linux new version
SublimeText3 Linux latest version

SublimeText3 Chinese version
Chinese version, very easy to use

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Mac version
God-level code editing software (SublimeText3)
