golang中的io.ReadCloser与ioutil.NopCloser使用

 更新时间:2024年03月28日 15:12:44   作者:raoxiaoya  
这篇文章主要介绍了golang中的io.ReadCloser与ioutil.NopCloser使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

io.ReadCloser与ioutil.NopCloser使用

type ReadCloser interface {
	Reader
	Closer
}
type nopCloser struct {
	io.Reader
}

func (nopCloser) Close() error { return nil }

// NopCloser returns a ReadCloser with a no-op Close method wrapping
// the provided Reader r.
func NopCloser(r io.Reader) io.ReadCloser {
	return nopCloser{r}
}

ioutil.NopCloser返回一个 io.ReadCloser,并且 close()方法没有任何操作 no-op

我们在操作req *http.Requestresponse *http.Response的时候,有时候需要读取Body,但是读了之后Body里面就被清空了,因此我们需要将读取的内容又重新赋值给Body

它的类型为io.ReadCloser

func(response *http.Response) error {
    cont, _ := ioutil.ReadAll(response.Body)
    fmt.Println(string(cont))

    response.Body = ioutil.NopCloser(bytes.NewReader(cont))
    return nil
}

golang中的ioutil和log包

  • func NopCloser
​func NopCloser(r io.Reader) io.ReadCloser​

NopCloser用一个无操作的Close方法包装r返回一个ReadCloser接口。

  • func ReadAll
​func ReadAll(r io.Reader) ([]byte, error)​

ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。

成功的调用返回的err为nil而非EOF。

因为本函数定义为读取r直到EOF,它不会将读取返回的EOF视为应报告的错误。

  • func ReadFile
​func ReadFile(filename string) ([]byte, error)​

ReadFile 从filename指定的文件中读取数据并返回文件的内容。

成功的调用返回的err为nil而非EOF。

因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。

  • func WriteFile
​func WriteFile(filename string, data []byte, perm os.FileMode) error​

函数向filename指定的文件中写入数据。

如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。

  • func ReadDir
​func ReadDir(dirname string) ([]os.FileInfo, error)​

返回dirname指定的目录的目录信息的有序列表。

  • func TempDir
​func TempDir(dir, prefix string) (name string, err error)​

在dir目录里创建一个新的、使用prfix作为前缀的临时文件夹,并返回文件夹的路径。

如果dir是空字符串,TempDir使用默认用于临时文件的目录(参见os.TempDir函数)。 

不同程序同时调用该函数会创建不同的临时目录,调用本函数的程序有责任在不需要临时文件夹时摧毁它。

  • func TempFile
​func TempFile(dir, prefix string) (f *os.File, err error)​

在dir目录下创建一个新的、使用prefix为前缀的临时文件,以读写模式打开该文件并返回os.File指针。

如果dir是空字符串,TempFile使用默认用于临时文件的目录(参见os.TempDir函数)。

不同程序同时调用该函数会创建不同的临时文件,调用本函数的程序有责任在不需要临时文件时摧毁它。

  • io func (*PipeReader) Read
​func (r *PipeReader) Read(data []byte) (n int, err error)​

Read实现了标准Reader接口:它从管道中读取数据,会阻塞直到写入端开始写入或写入端被关闭。

  • func (*PipeReader) Close
​func (r *PipeReader) Close() error​

Close关闭读取器;关闭后如果对管道的写入端进行写入操作,就会返回(0, ErrClosedPip)。

  • func (*PipeReader) CloseWithError
​func (r *PipeReader) CloseWithError(err error) error​

CloseWithError类似Close方法,但将调用Write时返回的错误改为err。

  • type PipeWriter
type PipeWriter struct {
    // 内含隐藏或非导出字段
}

PipeWriter是一个管道的写入端。

  • func (*PipeWriter) Write
​func (w *PipeWriter) Write(data []byte) (n int, err error)​

Write实现了标准Writer接口:它将数据写入到管道中,会阻塞直到读取器读完所有的数据或读取端被关闭。

  • func (*PipeWriter) Close
​func (w *PipeWriter) Close() error​

Close关闭写入器;关闭后如果对管道的读取端进行读取操作,就会返回(0, EOF)。

  • func (*PipeWriter) CloseWithError
​func (w *PipeWriter) CloseWithError(err error) error​

CloseWithError类似Close方法,但将调用Read时返回的错误改为err。

  • func TeeReader
​func TeeReader(r Reader, w Writer) Reader​

TeeReader返回一个将其从r读取的数据写入w的Reader接口。

所有通过该接口对r的读取都会执行对应的对w的写入。

没有内部的缓冲:写入必须在读取完成前完成。

写入时遇到的任何错误都会作为读取错误返回。

  • func MultiReader
​​func TeeReader(r Reader, w Writer) Reader​​

MultiReader返回一个将提供的Reader在逻辑上串联起来的Reader接口。

他们依次被读取。当所有的输入流都读取完毕,Read才会返回EOF。

如果readers中任一个返回了非nil非EOF的错误,Read方法会返回该错误。

  • func MultiWriter
​func MultiWriter(writers ...Writer) Writer​

MultiWriter创建一个Writer接口,会将提供给其的数据写入所有创建时提供的Writer接口。

  • func Copy
​func Copy(dst Writer, src Reader) (written int64, err error)​

将src的数据拷贝到dst,直到在src上到达EOF或发生错误。

返回拷贝的字节数和遇到的第一个错误。

对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。

如果src实现了WriterTo接口,本函数会调用src.WriteTo(dst)进行拷贝;否则如果dst实现了ReaderFrom接口,本函数会调用dst.ReadFrom(src)进行拷贝。

  • func CopyN
​func CopyN(dst Writer, src Reader, n int64) (written int64, err error)​

从src拷贝n个字节数据到dst,直到在src上到达EOF或发生错误。

返回复制的字节数和遇到的第一个错误。

只有err为nil时,written才会等于n。

如果dst实现了ReaderFrom接口,本函数很调用它实现拷贝。

  • func ReadAtLeast
​func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)​

ReadAtLeast从r至少读取min字节数据填充进buf。

函数返回写入的字节数和错误(如果没有读取足够的字节)。

只有没有读取到字节时才可能返回EOF;如果读取了有但不够的字节时遇到了EOF,函数会返回ErrUnexpectedEOF。 

如果min比buf的长度还大,函数会返回ErrShortBuffer。

只有返回值err为nil时,返回值n才会不小于min。

  • func ReadFull
​func ReadFull(r Reader, buf []byte) (n int, err error)​

ReadFull从r精确地读取len(buf)字节数据填充进buf。

函数返回写入的字节数和错误(如果没有读取足够的字节)。

只有没有读取到字节时才可能返回EOF;如果读取了有但不够的字节时遇到了EOF,函数会返回ErrUnexpectedEOF。 

只有返回值err为nil时,返回值n才会等于len(buf)。

  • func WriteString
​func WriteString(w Writer, s string) (n int, err error)​

WriteString函数将字符串s的内容写入w中。

如果w已经实现了WriteString方法,函数会直接调用该方法。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • golang爬虫colly 发送post请求

    golang爬虫colly 发送post请求

    本文主要介绍了golang爬虫colly 发送post请求实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Go语言append切片添加元素的实现

    Go语言append切片添加元素的实现

    本文主要介绍了Go语言append切片添加元素的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go语言设计模式之结构型模式

    Go语言设计模式之结构型模式

    本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题
    2021-06-06
  • Go 实现百万WebSocket连接的方法示例

    Go 实现百万WebSocket连接的方法示例

    这篇文章主要介绍了Go 实现百万WebSocket连接的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 深入理解Golang channel的应用

    深入理解Golang channel的应用

    channel是用于 goroutine 之间的同步、通信的数据结构。它为程序员提供了更高一层次的抽象,封装了更多的功能,这样并发编程变得更加容易和安全。本文通过示例为大家详细介绍了channel的应用,需要的可以参考一下
    2022-10-10
  • 一文带你了解Go语言中的匿名函数

    一文带你了解Go语言中的匿名函数

    无论是在Go语言还是其他编程语言中,匿名函数都扮演着重要的角色,本文将详细介绍Go语言中匿名函数的概念和使用方法,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • 通过Golang实现无头浏览器截图

    通过Golang实现无头浏览器截图

    在Web开发中,有时需要对网页进行截图,以便进行页面预览、测试等操作,本文为大家整理了Golang实现无头浏览器的截图的方法,感兴趣的可以了解一下
    2023-05-05
  • GO 使用Webhook 实现github 自动化部署的方法

    GO 使用Webhook 实现github 自动化部署的方法

    这篇文章主要介绍了GO 使用Webhook 实现github 自动化部署的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 深入Golang之context的用法详解

    深入Golang之context的用法详解

    本篇文章主要介绍了深入Golang之context的用法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 一文带你了解Go语言实现的并发神库conc

    一文带你了解Go语言实现的并发神库conc

    前几天逛github发现了一个有趣的并发库-conc,这篇文章将为大家详细介绍一下这个库的实现,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-01-01

最新评论