Go语言的io输入输出流
Go语言的输入输出流不如其他语言那么直观,由于是通过实现接口方法的隐式继承所以比较抽象,今天具体介绍一下go语言的输入输出流。
go语言输入输出在io库中
使用Reader
接口,如下:
type Reader interface { Read(p []byte) (n int, err error) }
Read方法从流中读取长度为len(p)
字节数据写入p。也就是使用Read
方法可以将流读到p
中,从而从流中到程序中。
当Read在读取n > 0个字节后遭遇错误或者到达文件结尾时,会返回读取的字节数。它可能会在该次调用返回一个非nil的错误,或者在下一次调用时返回0和该错误
io.Reader
是一个基本的接口,用于表示数据的读取。它只有一个方法Read
。io.ReadFull
从 io.Reader 中精确读取 len(buf) 字节的数据。
Writer
接口是写入流接口,如下:
type Writer interface { Write(p []byte) (n int, err error) }
Write
方法将len(p)
字节数据从p
写入底层的数据流。
它会返回写入的字节数(0 <= n <= len(p)
)和遇到的任何导致写入提取结束的错误。Write必须返回非nil的错误,如果它返回的 n < len(p)
。Write不能修改切片p中的数据,即使临时修改也不行。
io.Writer
是一个基本的接口,用于表示数据的写入。它只有一个方法Write
io.WriteString
向io.Writer
写入字符串。
流复制,从输出流复制到输出流,如下:
func Copy(dst Writer, src Reader) (written int64, err error)
上述只是输入输出流的基本用法
还有许多继承类,如下:
os.File
同时实现了 io.Reader 和 io.Writerstrings.Reader
实现了 io.Readerbufio.Reader/Writer
分别实现了 io.Reader 和 io.Writerbytes.Buffer
同时实现了 io.Reader 和 io.Writerbytes.Reader
实现了 io.Readercompress/gzip.Reader/Writer
分别实现了 io.Reader 和 io.Writercrypto/cipher.StreamReader/StreamWriter
分别实现了 io.Reader 和 io.Writercrypto/tls.Conn
同时实现了 io.Reader 和 io.Writerencoding/csv.Reader/Writer
分别实现了 io.Reader 和 io.Writermime/multipart.Part
实现了 io.Readernet/conn
分别实现了 io.Reader 和 io.Writer(Conn接口定义了Read/Write)
上述包和结构体都实现了io.Reader
方法,因此都可以使用Read
方法将流读取到程序中。
常用的类型有
os.File、strings.Reader、bufio.Reader/Writer、bytes.Buffer、bytes.Reader
可以看到直接获取字节流的ReadFile
方法也是调用了Read
方法,如下:
在strings的也存在Reader接口,看源码如下:
等等其他几个接口也是如此,在未被封装的时候都是调用Read
方法。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。