原文链接 http://ironxu.com/772

本文介绍Go 标准库 io 常用的导出函数,结构体和方法。

io 包提供了对 I/O 原语的基本接口,这些接口抽象出了泛用的函数并附加了一些操作。因为这些接口是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发安全的。

1. io 包的接口

Reader

type Reader interface {Read(p []byte) (n int, err error)
}

Reader 接口用于包装基本的读取方法。Read 方法读取 len(p) 字节数据写入p。它返回写入的字节数和遇到的任何错误。即使Read方法返回值 n < len(p),本方法在被调用时仍可能使用p的全部长度作为暂存空间。如果有部分可用数据,但不够len(p)字节,Read会返回可以读取到的数据,而不是等待更多数据。

Writer

type Writer interface {Write(p []byte) (n int, err error)
}

Writer 接口用于包装基本的写入方法。Write 方法将 len(p) 字节数据从p写入底层的数据流。它会返回写入的字节数据(0 <= n <= len(p)) 和遇到的任何导致写入提取结束的错误。如果它返回的 n < len(p), Write必须返回非nil的错误。

type Closer

type Closer interface {Close() error
}

Closer 接口用于包装基本的关闭方法。

Seeker

type Seeker interface {Seek(offset int64, whence int) (int64, error)
}

Seeker 接口用于包装基本的移位方法。Seek方法设定下一次读写的位置:偏移量为offset,校准点由whence确定:0表示相对于文件起始;1表示相对于当前位置;2表示相对于文件结尾。Seek方法返回新的位置以及可能遇到的错误。

ReaderAt

type ReaderAt interface {ReadAt(p []byte, off int64) (n int, err error)
}

ReaderAt 接口包装了基本的ReadAt方法。ReadAt从底层输入流的偏移量off位置读取len(p) 字节数据写入p, 它返回读取的字节数(0 <= n <= len(p)) 和遇到的任何错误。

ByteReader

type ByteReader interface {ReadByte() (c byte, err error)
}

ByteReader 是基本的ReadByte方法的包装。ReadByte读取输入中的单个字节并返回。如果没有字节可读取,会返回错误。

ByteScanner

type ByteScanner interface {ByteReaderUnreadByte() error
}

ByteScanner 接口在基本的ReadByte 方法之外还添加了UnreadByte方法。UnreadByte方法让下一次调用ReadByte时返回之前调用ReadByte时返回的同一个字节。连续调用两次UnreadByte方法而中间没有调用ReadByte时,可能会导致错误。

ReaderFrom

type ReaderFrom interface {ReadFrom(r Reader) (n int64, err error)
}

ReaderFrom 接口包装了基本的ReadFrom方法。ReadFrom 方法从r 读取数据直到EOF或者遇到错误。返回值n是读取的字节数,执行时遇到的错误(EOF除外)也会被返回。

相应还有 write 类接口,不一一列举

1.1 LimitedReader

type LimitedReader struct {R Reader // underlying readerN int64  // max bytes remaining
}

LimitedReader 从R中读取数据,但限制可以读取的数据的量为最多N 字节,每次调用Read方法都会更新N 以标记剩余可以读取的字节数。

  • func LimitReader(r Reader, n int64) LimitedReader // 创建一个 LimitedReader
  • func (l *LimitedReader) Read(p []byte) (n int, err error)

1.2 SectionReader

type SectionReader struct {r     ReaderAtbase  int64off   int64limit int64
}

SectionReader 实现了对底层满足ReadAt 接口的输入流某个片段的Read、ReadAt、Seek方法。

  • func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader // 返回一个从r中的偏移量off处为起始,读取n个字节后以停止的SectionReader
  • func (s *SectionReader) Size() int64 // Size返回该片段的字节数

2. io 导出函数

  • func WriteString(w Writer, s string) (n int, err error) // 将字符串s的内容写入w中
  • func Copy(dst Writer, src Reader) (written int64, err error) // 将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误

$GOPATH/src/github.com/ironxu/go_note/library/io/io.go 源码如下:

// go 标准库 io
package mainimport ("fmt""io""log""os""strings"
)func main() {r := strings.NewReader("go is a programming language\n")if n, err := io.Copy(os.Stdout, r); err != nil {log.Fatal(n, err)}// writestringio.WriteString(os.Stdout, "hello go\n")// 从标准输入copy 到标准输出if n, err := io.Copy(os.Stdout, os.Stdin); err != nil {fmt.Println(n, err)}
}

参考

  • pkg/io 中文
  • pkg/io

Go 标准库: io相关推荐

  1. linux下c标准库位置,C 标准库 IO 使用详解

    其实输入与输出对于不管什么系统的设计都是异常重要的,比如设计 C 接口函数,首先要设计好输入参数.输出参数和返回值,接下来才能开始设计具体的实现过程.C 语言标准库提供的接口功能很有限,不像 Pyth ...

  2. 标准库IO与系统调用IO区别与联系

    标准库IO接口: 一般程序运行起来,自动默认打开 标准输入文件  fd=0(scanf),标准输出文件  fd=1(printf),  标准错误文件  fd=2 fopen   打开文件 FILE* ...

  3. python 标准库 —— io(StringIO)

    0. io流(io stream) 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作 ...

  4. Go语言自学系列 | golang标准库io包

    视频来源:B站<golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]> 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持! ...

  5. Go标准库日志打印,以及同时输出到控制台和文件

    打印 在使用go写一些小程序时,我们没必要引入额外的包,直接使用fmt标准包打印即可: import "fmt"func main() {fmt.Println("lin ...

  6. C++ Primer 5th笔记(chap 17 标准库特殊设施)多字节低层IO操作

    1. 多字节操作 一些未格式化 IO 操作一次处理大块数据,这些操作要求我们自己分配并管理用来保存和提取数据的字符数组 操作 解释 is.get(sink, size, delim) 从is中读取最多 ...

  7. Python标准库中的io

    Python标准库中io模块中有两个比较重要的组成部分:StringIO.BytesIO 1.StringIO StringIO 的作用是在内存中读写字符串,其示例代码如下: from io impo ...

  8. C++prime读书笔记(二)C++标准库:IO、容器、泛型算法、动态内存

    layout: post title: C++prime读书笔记(二)C++标准库:IO.容器.泛型算法.动态内存 description: C++prime读书笔记(二)C++标准库:IO.容器.泛 ...

  9. 标准C库IO函数和Linux系统IO函数对比

    标准C库IO函数和Linux系统IO函数对比 man 3 fopen #查看函数详情 虚拟地址通过mmu映射到真是的地址空间

最新文章

  1. 摆地摊创业赚钱完全详细攻略
  2. 关于解决GPS定位设备:GPS静态漂移的方法
  3. Ubuntu使用——23(dock的美化)
  4. Sentinel 发布里程碑版本,添加集群流控功能
  5. linux进程之间传递句柄
  6. 【译】谨慎使用CSS中的波浪选择器
  7. [Sharepoint2007对象模型]第二回:Web应用程序服务(SPWebService)
  8. Windows Server Version 1709 管理之入门篇 1
  9. java常用设计模式七:装饰模式
  10. css选择器位置和数量技巧
  11. mysql 5.7 sql mode_MySQL 5.7版本sql_mode=only_full_group_by问题
  12. 手动抛出异常_超实用:关于Java异常设计和处理
  13. WPS或Excel将姓名变为拼音
  14. xp启用计算机共享打印机,Win7共享XP打印机设置方法【win7不能共享xp打印机】解决方法...
  15. matlab步进电机模糊pid和BP神经网络控制
  16. 最新IP地理数据库(dat文件) --别花钱了
  17. 苏宁11.11:系统拆分的一些经验谈
  18. 软件实施工程师是一个什么样的工作?他的具体工作内容是什么?发展前景怎样?
  19. LSI收购Sandforce
  20. docker 搭建 storm

热门文章

  1. table表格for循环绑定数据_.NET MVC 页面表格绘制
  2. MSP, CMP傻傻分不清楚?一文读懂云管理的春天
  3. 深度学习logit是什么?
  4. tf.group()用于组合多个操作
  5. YARN部件以及执行流程
  6. 卸载Android虚拟机里的项目(cmd)
  7. 某易游戏经典吃豆豆动画404页面源码
  8. python按指定条件筛选_求Python筛选数字集合内满足指定条件的数据方法,python筛选,唯一匹配是指mdash...
  9. 物理服务器向虚拟化无缝对接,服务器虚拟化下的网络变迁
  10. CSS3账号密码输入框动画模板