iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >go语言eof错误是什么
  • 842
分享到

go语言eof错误是什么

eof错误go语言 2023-05-14 20:05:32 842人浏览 八月长安
摘要

在Go语言中,eof是指文件结尾错误,是Go语言中最重要的错误变量,存在于io包中,用于表示输入流的结尾。因为每个文件都有一个结尾,所以“io.EOF”很多时候并不能算是一个错误,它更重要的是表示一个输入流结束了。本教程操作环境:windo

Go语言中,eof是指文件结尾错误,是Go语言中最重要的错误变量,存在于io包中,用于表示输入流的结尾。因为每个文件都有一个结尾,所以“io.EOF”很多时候并不能算是一个错误,它更重要的是表示一个输入流结束了。

go语言eof错误是什么

教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

golang 文件结尾错误(EOF)

函数经常会返回多种错误,这对终端用户来说可能会很有趣,但对程序而言,这使得情况变得复杂。很多时候,程序必须根据错误类型,作出不同的响应。让我们考虑这样一个例子:

从文件中读取n个字节。如果n等于文件的长度,读取过程的任何错误都表示失败。如果n小于文件的长度,调用者会重复的读取固定大小的数据直到文件结束。这会导致调用者必须分别处理由文件结束引起的各种错误。

基于这样的原因,io包保证任何由文件结束引起的读取失败都返回同一个错误——io.EOF,该错误在io包中定义:

package io
import "errors"
// EOF is the error returned by Read when no more input is available.
var EOF = errors.New("EOF")

认识io.EOF

io.EOF是io包中的变量, 表示文件结束的错误:

package io23var EOF = errors.New("EOF")

也通过以下命令查看详细文档:

$ 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大约可以算是Go语言中最重要的错误变量了, 它用于表示输入流的结尾. 因为每个文件都有一个结尾, 所以io.EOF很多时候并不能算是一个错误, 它更重要的是表示一个输入流结束了。

io.EOF设计的缺陷

可惜标准库中的io.EOF的设计是有问题的. 首先EOF是End-Of-File的缩写, 根据Go语言的习惯大写字母缩写一般表示常量. 可惜io.EOF被错误地定义成了变量, 这导致了api权限的扩散. 而最小化API权限是任何一个模块或函数设计的最高要求. 通过最小化的权限, 可以尽早发现代码中不必要的错误.

比如Go语言一个重要的安全设计就是禁止隐式的类型转换. 因此这个设计我们就可以很容易发现程序的BUG. 此外Go语言禁止定义没有被使用到的局部变量(函数参数除外, 因此函数参数是函数接口的一个部分)和禁止导入没有用到的包都是最小化权限的最佳实践. 这些最小API权限的设计不仅仅改进了程序的质量, 也提高了编译工具的性能和输出的目标文件.

因为EOF被定义成一个变量, 这导致了该变量可能会被恶意改变. 下面的代码就是一种优雅的埋坑方式:

func init() {2    io.EOF = nil3}

这虽然是一个段子, 但是却真实地暴漏了EOF接口的设计缺陷: 它存在严重的安全隐患. 变量的类型似乎也在暗示用户可以放心地修改变量的值. 因此说EOF是一个不安全也不优雅的设计.

io.EOF改为常量

一个显然的改进思路是将io.EOF定义为常量. 但是因为EOF对应一个表示error接口类型, 而Go语言目前的常量语法并不支持定义常量类型的接口. 但是我们可以通过一些技巧绕过这个限制.

Go语言的常量有bool/int/float/string/nil这几种主要类型. 常量不仅仅不包含接口等复杂类型, 甚至连常量的数组或结构体都不支持! 不过常量有一个重要的扩展规则: 以bool/int/float/string/nil为基础类型定义的新类型也支持常量.

比如, 我们重新定义一个字符串类型, 它也可以支持常量的:

type MyString string2const name MyString = "chai2010"

这个例子中MyString是一个新定义的类型, 可以定义这种类型的常量, 因为它的底层的string类型是支持常量的.

那么io.EOF的底层类型是什么呢? EOF是通过errors.New("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
}

因此io.EOF底层的类型是errors.errorString结构体. 而结构体类型是不支持定义常量的. 不过errors.errorString结构体中只有一个字符串类型, io.EOF对应的错误字符串正是"EOF".

我们可以为EOF重新实现一个以字符串为底层类型的新错误类型:

package io

type errorString string

func (e errorString) Error() string {
    return string(e)
}

这个新的io.errorString实现了两个特性: 首先是满足了error接口; 其次它是基于string类型重新定义, 因此支持定义常量. 因此我们可以基于errorString重新将io.EOF定义为常量:

const EOF = errorString("EOF")

这样EOF就变成了编译时可以确定的常量类型, 常量的值依然是“EOF”字符串. 但是也带来了新的问题: EOF已经不再是一个接口类型, 它会破坏旧代码的兼容性吗?

【相关推荐:Go视频教程、编程教学】

以上就是go语言eof错误是什么的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: go语言eof错误是什么

本文链接: https://www.lsjlt.com/news/203622.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言eof错误是什么
    在go语言中,eof是指文件结尾错误,是Go语言中最重要的错误变量,存在于io包中,用于表示输入流的结尾。因为每个文件都有一个结尾,所以“io.EOF”很多时候并不能算是一个错误,它更重要的是表示一个输入流结束了。本教程操作环境:windo...
    99+
    2023-05-14
    eof错误 go语言
  • go语言eof错误指的是什么
    这篇文章主要介绍了go语言eof错误指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言eof错误指的是什么文章都会有所收获,下面我们一起来看看吧。在go语言中,eof是指文件结尾错误,是Go语言中...
    99+
    2023-07-05
  • 什么是go语言
    Go语言(又称Golang)是由Google开发的一种静态类型、编译型的开源编程语言。Go语言的设计目标是简洁、高效、安全和并发,旨在提供一种易于编写和维护的系统级编程语言。它结合了静态类型语言的安全性和高效性,以及动态类型语言的灵活性和开...
    99+
    2023-10-26
    go语言
  • Go语言是什么
    Go语言(又称 Golang)是一种静态强类型、编译型的编程语言,可以轻松构建简单、可靠以及高效的软件。Go语言语法与C语言相近,但功能更加丰富。Go语言的作者有三个,他们分别是:罗伯特·格利茨默(Robert Griesemer)、罗伯·...
    99+
    2022-10-24
  • go语言是什么编程语言
    go语言是是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go是一种过程编程语言,可用于快速机器代码编译;它提供了并发机制,可以轻松开发多核和联网的机器级程序;它提供对接口和类型嵌入的支持。本教程操作环境:...
    99+
    2023-05-14
    Golang go语言
  • go语言和c语言是什么
    这篇文章主要介绍了go语言和c语言是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言和c语言是什么文章都会有所收获,下面我们一起来看看吧。Go(又称Golang)是Google开发的一种静态强类型、编...
    99+
    2023-07-04
  • Go语言的错误处理方式
    这篇文章主要介绍“Go语言的错误处理方式”,在日常操作中,相信很多人在Go语言的错误处理方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言的错误处理方式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-15
  • Go语言中怎么有效处理错误
    今天就跟大家聊聊有关Go语言中怎么有效处理错误,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、简介Go语言受到诟病最多的一项就是其错误处理机制。如...
    99+
    2022-10-19
  • go语言规范RESTful API业务错误处理的方法是什么
    这篇“go语言规范RESTful API业务错误处理的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go...
    99+
    2023-07-05
  • c语言中link错误指的是什么
    在C语言中,link错误是指在编译过程中发生的连接错误。连接(linking)是将多个源文件和库文件合并为一个可执行文件的过程。 当...
    99+
    2023-10-23
    c语言
  • go语言的底层是什么语言
    go语言的底层是C语言,Go语言是由C和C++开发者创建的,因此它的底层实现也是用C语言编写的,Go语言底层使用了很多C语言的特性和实现方式,如内存管理、指针、函数调用等,这使得Go语言可以直接调用C语言的库函数,也方便了Go语言与其他编程...
    99+
    2023-07-10
  • 怎么解决Go语言的read读取错误
    这篇文章主要讲解了“怎么解决Go语言的read读取错误”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决Go语言的read读取错误”吧!情景描述代码中需要实现一个客户端与服务器的数据重传...
    99+
    2023-06-16
  • go语言切片是什么
    go语言切片是对数组的一种抽象。切片是对数组的引用,包含了指向数组元素的指针、切片的长度和容量。创建切片的方式有:1、使用内置的make函数创建一个切片;2、使用切片的字面量创建一个切片;3、从另一个切片创建新的切片。可以使用内置的appe...
    99+
    2023-12-11
    Golang go语言
  • go和c是什么语言
    Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言;Go语言语法与C相近,但功能上有内存安全、GC(垃圾回收)、结构形态及CSP-style并发计算。C语言是一门面向过程的、抽象化的通用...
    99+
    2023-05-14
    go语言 Golang C语言
  • go语言的beego是什么
    beego是一个使用Go语言开发的应用Web框架,目的是为大家提供一个高效率的Web应用开发框架,该框架采用模块封装。beego可以用来快速开发API、Web、后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado...
    99+
    2023-05-14
    go语言 Golang
  • go语言数组是什么
    Go语言中的数组是一种复合数据类型,用于存储固定大小、相同类型的元素序列。数组是一种非常基础的数据结构,在程序设计中具有广泛的应用场景。详细介绍:在Go语言中,数组的长度是一个非常重要的概念。数组决定了数组可以容纳的元素的数量,也决定了数组...
    99+
    2023-12-12
    go语言 Golang go语言数组
  • C语言开发中的常见错误是什么
    这篇“C语言开发中的常见错误是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言开发中的常见错误是什么”文章吧。一、编...
    99+
    2023-06-30
  • Go语言中变量是什么
    在Go语言中,变量是程序运行过程中,内容可以变化(修改)的量; 变量是程序的基本组成单位,是内存中一个数据存储空间的表示,可以通过变量名找到变量值。变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念。本教程操作环境:...
    99+
    2023-05-14
    Go go语言 Golang
  • go语言中泛型是什么
    在go语言中,泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型;通过引入类型形参和类型实参的概念,让一个函数能够处理多种不同类型数据的能力,这种编程方式被称为泛型编程。本教程操作环境:windows7系统、GO 1.18版本...
    99+
    2023-05-14
    泛型 Go Golang go语言
  • go语言接口是干什么
    go语言接口提供了一种灵活的方式来定义对象的行为,并且可以在不关心具体实现的情况下使用这些对象。通常用于:1、抽象数据类型,可以定义一个抽象的数据类型,该类型可以由不同的具体类型实现;2、依赖注入,可以将一个对象的实现与其使用分离;3、测试...
    99+
    2023-12-11
    go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作