当前位置: 代码网 > it编程>前端脚本>Golang > golang中的io.ReadCloser与ioutil.NopCloser使用

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

2024年05月15日 Golang 我要评论
io.readcloser与ioutil.nopcloser使用type readcloser interface {readercloser}type nopcloser struct {io.re

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方法,函数会直接调用该方法。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com