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.request
和response *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方法,函数会直接调用该方法。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论