search
HomeBackend DevelopmentGolangWhat is the go language eof error?
What is the go language eof error?Feb 06, 2023 pm 02:10 PM
go languageeof error

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.

What is the go language eof error?

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!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
go语言有没有缩进go语言有没有缩进Dec 01, 2022 pm 06:54 PM

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

go语言为什么叫gogo语言为什么叫goNov 28, 2022 pm 06:19 PM

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

一文详解Go中的并发【20 张动图演示】一文详解Go中的并发【20 张动图演示】Sep 08, 2022 am 10:48 AM

Go语言中各种并发模式看起来是怎样的?下面本篇文章就通过20 张动图为你演示 Go 并发,希望对大家有所帮助!

tidb是go语言么tidb是go语言么Dec 02, 2022 pm 06:24 PM

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

go语言能不能编译go语言能不能编译Dec 09, 2022 pm 06:20 PM

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

【整理分享】一些GO面试题(附答案解析)【整理分享】一些GO面试题(附答案解析)Oct 25, 2022 am 10:45 AM

本篇文章给大家整理分享一些GO面试题集锦快答,希望对大家有所帮助!

go语言是否需要编译go语言是否需要编译Dec 01, 2022 pm 07:06 PM

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

golang map怎么删除元素golang map怎么删除元素Dec 08, 2022 pm 06:26 PM

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

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Safe Exam Browser

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 new version

SublimeText3 Linux latest version

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)