通知:即日起,禁止携带Note 7登机,且不得作为航空货物托运或承运
06-17
前言 io 包提供了 I/O(输入输出,即输入输出)原语的基本接口。它的基本任务是包装这些原语的现有实现(例如 中的 os 包原语),使其成为共享的公共接口。
例如,Go语言标准库strings、bytes、bufio、os中,都有实现io.Reader的类型。本篇文章我们将通过IO库定义的接口一步步加深理解。
对于io库定义的接口,首先看IO库的代码,src/io/io.go。这里是所有io接口、基本接口和组合接口的定义。
不过请注意,这只是定义了接口语义,并不涉及接口的具体实现,我们会根据日常遇到的情况列出一些场景。这里我大致了解了这些接口之间的关系,如下图: io库接口定义图中的Reader、Writer、Closer、Seeker接口是基本接口,但是组合类型接口中的ReadWriter是在这些的基础上组合而成的匿名,然后还有一些独立的接口,比如ReaderFrom。
我们先来看看读者。 Reader 是一个包装了基本 Read 方法的接口。
Read 最多可以将 len (p) 个字节读入 p 中。它返回读取的字节数 (0<=n<=len (p)) 和遇到的任何错误。
代码语言:javascript copy type Reader 接口 { Read(p []byte) (n int, err error)}Writer 是一个包装了基本 Write 方法的接口。 Write 将 p 中的 len (p) 个字节写入底层数据流。
它返回从 p (0<=n<=len(p)) 写入的字节数,以及遇到的导致写入提前停止的任何错误。如果 Write 返回 n bytes 和 bufio 包都有 Wirte 方法的实现。我稍后会发布图片。 我们可以根据列出的结构体来查看IO接口的具体实现方法。代码语言:javascript copy type Writer 接口 { Write(p []byte) (n int, err error)} 例如 ReadWriter 是一个组合类型接口。 它是使用匿名字段的 Reader 和 Writer 接口的组合。如果要实现ReadWriter接口,则必须同时实现Reader和Writer接口的方法。 代码语言:javascript复制类型 ReadWriter 接口 { Reader Writer } io接口的丰富实现。 Go基于io定义了哪些接口实现?你看我总结的图就知道了。 是不是很熟悉?原来字符串、字节、os都有很多。完成。 基于io接口的实现创建内存。 Readerbytes.NewReader 和 strings.NewReader 都可以包裹 []byte 或 string 并返回一个 Reader 代码语言,该代码语言实现了所有与读取相关的接口: javascript copy // bytes package func NewReader(b []byte) * Reader//strings package func NewReader(s string) *Reader在什么场景下使用?比如我们发送一个Post请求,其中body就是我们要发送的数据,是一个io.Reader。 代码语言: javascript copy func ( c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error)//字符串和字节调用 NewReaderhttp.Post(" "text/plain", strings.NewReader("stings test" ))http.Post(" "text/plain", bytes.NewReader([]byte("bytes test"))os.File 读取文件 Go 的 File 文件句柄(File 实际上是一个结构体),File结构体外部实现的接口,如Read、Write、ReadAt、WriteAt等。代码语言:javascript copy type File struct { *file // os Specific}type file struct { pfd poll.FD name string dirinfo *dirInfo // nil 除非正在读取目录 appendMode bool // 是否打开文件进行追加} 我们使用 os.Open 或 os.OpenFile 来获取 File 结构体的指针,然后读取打开文件的内容 例如: 代码。 语言:javascript复制文件,err:= os.Open("1.txt") if err != nil { return } //函数退出时,及时关闭文件句柄 defer file.Close() //Return *Reader reader := bufio.NewReader(file) // 读取换行符后终止 str,err := reader.ReadString('\n') //NewReader 函数 func NewReader(rd io.Reader) *Reader { return NewReaderSize(rd, defaultBufSize)} 是不是感觉很熟悉?来看看代码逻辑,首先获取File句柄。由于 File 实现了 IO.Reader 接口,因此 bufio.NewReader() 可以传递文件句柄并创建缓冲区(默认大小)。 bufio 实现了 ReadString 接口来读取缓冲区内容。 Go总结 io的核心是io库。 如果要实现接口,还是需要多阅读源码注释。除了定义的接口之外,io/ioutil提供的ReadFile和ReadAll函数也非常有用。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-21
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用