GO语io包的常用接口
本篇文章向大家介绍《GO语io包的常用接口》,主要包括GO语接口,具有一定的参考价值,需要的朋友可以参考一下。
本文实例分析了GO语io包的常用接口。分享给大家供大家参考。具体分析如下:
我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在 Golang 中非常迷糊,特别是文件的读写操作,因为 Go 的文件读写操作有很多的方法,让我不知道怎么选择。直到我学习了 interface 的概念,然后由看了 package io 后才慢慢理解,也渐渐的喜欢上了 Golang 的灵活性。以我的经验来说,接口是一个很重要的知识点,是一系列操作的规范,特别是公共接口尤为重要,如:package io
本文仅仅列举最常用的几个接口,如果您想系统的学习 io 接口,建议阅读底部参考链接。
一、IO 接口概述
package os 提供了对 I/O 原语的基本接口,使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。因为这些接口和原语是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发执行安全的。
在 package os 中最重要的是两个接口:Reader 和 Writer 接口。本章所提到的各种接口,都跟这两个接口有关,也就是说,只要实现了这两个接口,它就有了 IO 的功能。
小贴士:
var EOF = errors.New("EOF"): 在 package io中定义,使用非常频繁。正常情况下当 Read() 无法得到更多返回时就返回 EOF,即文件到达了结尾(end-of-file)。
二、io.Reader 和 io.Writer
定义:
复制代码 代码如下:type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
Read 将 len(p) 个字节读取到 p 中,当遇到任何错误(包括EOF)会立即返回已读取的字节数,函数结束会返回成功读取的字节数和任何错误。
Write 将 len(p) 字节数据从 p 写入底层的数据流,然后返回成功写入的字节数和任何错误。
从接口名称很容易猜到,一般地,Go中接口的命名约定:接口名以er结尾。注意,这里并非强行要求,你完全可以不以 er 结尾。标准库中有些接口也不是以 er 结尾的。
示例:
复制代码 代码如下:func wr() {
f, _ := os.Create("at.txt")
defer f.Close()
f.Write([]byte("Go是一种令人愉悦的编程语言")) //写入字节流
f.Seek(0, os.SEEK_SET) //将指针重置
p := make([]byte, 2) // 读取 2 byte( len(buf)=2 )
if _, err := f.Read(p); err != nil {
log.Fatal("[F]", err)
}
fmt.Printf("读取字符 \"%s\", 长度为 %d byte\n", p, len(p))
p = make([]byte, 50)
if _, err := f.Read(p); err != nil {
if err != io.EOF { //忽略 EOF 错误
log.Fatal("[F]", err)
}
}
fmt.Printf("读取字符 \"%s\", 长度为 %d byte\n", p, len(p))
}
读取字符 "Go", 长度为 2 byte
读取字符 "是一种令人愉悦的编程语言 ", 长度为 50 byte
三、io.ReaderAt 和 os.WriterAt
定义(off 是 offset 的缩写):
复制代码 代码如下:type ReaderAt interface {
ReadAt(p []byte, off int64) (n int, err error)
}
type WriterAt interface {
WriteAt(p []byte, off int64) (n int, err error)
}
ReadAt() 从基本输入源的偏移量 off 处开始,其他和 Read() 一样;
WriteAt() 从基本输入源的偏移量 off 处开始,其他和 Write() 一样。
示例:
复制代码 代码如下:func at() {
f, _ := os.Create("at.txt")
defer f.Close()
f.WriteString("Go是一种令人愉悦的编程语言")
f.WriteAt([]byte("程序"), 26) //偏移 26byte 改写“编程”->“程序”
fi, _ := f.Stat() //获取文件信息
p := make([]byte, fi.Size()-2) //文件大小减去偏移值
f.ReadAt(p, 2) //偏移 2 byte
os.Stdout.Write(p)
}
四、io.ReaderFrom 和 os.WriterTo
定义:
复制代码 代码如下:type ReaderFrom interface {
ReadFrom(r Reader) (n int64, err error)
}
type WriterTo interface {
WriteTo(w Writer) (n int64, err error)
}
ReadFrom() 从 r 中读取数据,直到 EOF 或发生错误。返回读取的字节数和 io.EOF 之外的其他错误。ReadFrom不会返回EOF错误
WriteTo() 将数据写入 w 中,直到没有数据可写或发生错误。返回写入的字节数和任何错误。
示例:
复制代码 代码如下:func fromTo() {
r := strings.NewReader("Go是一种令人愉悦的编程语言") //创建一个 Reader
w := bufio.NewWriter(os.Stdout) //创建一个 Writer
w.ReadFrom(r) // w 一次性读取 r 的全部内容
w.Flush()
r.Seek(0, os.SEEK_SET) //重置指针
r.WriteTo(w) // r 一次性将内容写入 w 中
w.Flush()
}
五、io.Seeker
定义:
复制代码 代码如下:type Seeker interface {
Seek(offset int64, whence int) (ret int64, err error)
}
Seek 设置下一次 Read 或 Write 的偏移量(offset),它的解释取决于 whence。示例见上文。
whence的值,在os包中定义了相应的常量:
复制代码 代码如下:SEEK_SET int = 0 //从文件的起始处开始设置 offset
SEEK_CUR int = 1 //从文件的指针的当前位置处开始设置 offset
SEEK_END int = 2 //从文件的末尾处开始设置 offset
六、io.Closer
定义:
复制代码 代码如下:type Closer interface {
Close() error
}
用于关闭数据流,释放资源,不用多废话了吧。
七、其他
复制代码 代码如下:type ByteReader interface {
ReadByte() (c byte, err error)
}
type RuneReader interface {
ReadRune() (r rune, size int, err error)
}
ReadByte读取输入中的单个字节并返回。如果没有字节可读取,会返回错误。
ReadRune读取单个utf-8编码的字符,返回该字符和它的字节长度。如果没有有效的字符,会返回错误。
复制代码 代码如下:type ByteWriter interface {
WriteByte(c byte) error
}
WriteByte写入一个字节,如果写入失败会返回错误。
参考:
https://gowalker.org/io
https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.1.md
希望本文所述对大家的GO语言程序设计有所帮助。
文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《GO语io包的常用接口》文章吧,也可关注golang学习网公众号了解相关技术文章。

- 上一篇
- GO语言基本类型分析

- 下一篇
- GO语言文件的创建与打开实例分析
-
- 大方的黑夜
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢大佬分享博文!
- 2023-02-14 13:11:06
-
- 阔达的路人
- 这篇技术贴出现的刚刚好,太细致了,很好,码住,关注博主了!希望博主能多写Golang相关的文章。
- 2023-02-12 08:05:18
-
- 要减肥的唇膏
- 太细致了,已收藏,感谢博主的这篇文章,我会继续支持!
- 2023-02-04 18:22:17
-
- 等待的棒棒糖
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者分享文章!
- 2023-01-30 14:18:58
-
- 美好的冬日
- 这篇文章内容真是及时雨啊,太细致了,赞 👍👍,已收藏,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-01-16 21:28:26
-
- Golang · Go教程 | 3小时前 |
- Go语言闭包使用误区深扒
- 416浏览 收藏
-
- Golang · Go教程 | 5小时前 | net 跨平台开发 兼容性问题 path/filepath os/exec
- Go语言跨平台开发兼容性问题解析
- 189浏览 收藏
-
- Golang · Go教程 | 7小时前 |
- DebianHadoop数据存储策略深度解析
- 213浏览 收藏
-
- Golang · Go教程 | 8小时前 | 代码封装 sync.Mutex io.TeeReader ReadTimeout WriteTimeout
- Go语言http包处理请求常见问题解决方案
- 315浏览 收藏
-
- Golang · Go教程 | 8小时前 | Goroutine GOMAXPROCS context包 调度机制 M:N模型
- Go语言Goroutine调度机制及常见问题解析
- 381浏览 收藏
-
- Golang · Go教程 | 13小时前 |
- Debiansyslog支持协议及配置攻略
- 128浏览 收藏
-
- Golang · Go教程 | 14小时前 |
- Go语言time.Ticker与time.After使用差异及问题解析
- 340浏览 收藏
-
- Golang · Go教程 | 14小时前 |
- Go语言闭包误区深度解析及解决方案
- 298浏览 收藏
-
- Golang · Go教程 | 15小时前 |
- Debian系统Tomcat日志查看攻略
- 249浏览 收藏
-
- Golang · Go教程 | 18小时前 |
- Debian积压如何影响你的游戏体验
- 460浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 24次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 40次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 38次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 50次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 41次使用
-
- Golangmap实践及实现原理解析
- 2022-12-28 505浏览
-
- 试了下Golang实现try catch的方法
- 2022-12-27 502浏览
-
- Go语言中Slice常见陷阱与避免方法详解
- 2023-02-25 501浏览
-
- Golang中for循环遍历避坑指南
- 2023-05-12 501浏览
-
- Go语言中的RPC框架原理与应用
- 2023-06-01 501浏览