diff --git a/eBook/11.8.md b/eBook/11.8.md index e69de29..a806e32 100644 --- a/eBook/11.8.md +++ b/eBook/11.8.md @@ -0,0 +1,27 @@ +# 11.8 第二个例子:读和写 + +读和写是软件中很普遍的行为,提起它们会立即想到读写文件、缓存(比如字节或字符串切片)、标准输入输出、标准错误以及网络连接、管道等等,或者读写我们的自定义类型。为了是代码尽可能通用,Go 采取了一致的方式来读写数据。 + +`io` 包提供了用于读和写的接口:`io.Reader` 和 `io.Writer` + +```go +type Reader interface { + Read(p []byte) (n int, err error) +} + +type Writer interface { + Write(p []byte) (n int, err error) +} +``` + +只要类型实现了读写接口,提供 `Read()` 和 `Write` 方法,就可以从它读取数据,或向它写入数据。一个对象要是可读的,它必须实现 `io.Reader` 接口,这个接口只有一个签名是 `Read(p []byte) (n int, err error)` 的方法,它从调用它的对象上读取数据,并把读到的数据放入参数中的字节切片中,然后返回读取的字节数和一个 `error` 对象,如果没有错误发生返回 'nil',如果已经到达输入的尾端,会返回 `io.EOF("EOF")`,如果读取的过程中发生了错误,就会返回具体的错误信息。类似地,一个对象要是可写的,它必须实现 `io.Writer` 接口,这个接口也只有一个签名是 `Write(p []byte) (n int, err error)` 的方法,它将指定字节切片中的数据写入调用它的对象里,然后返回实际写入的字节数一个 `error` 对象(如果没有错误发生就是 `nil`)。 + +`io` 包里的 `Readers` 和 `Writers` 都是不带缓冲的,`bufio` 包里提供了对应的带缓冲的操作,在读写 `UTF-8` 编码的文本文件时它们尤其有用。在 第12章 我们会看在实战使用它们的很多例子。 + +在实际编程中尽可能的使用这些接口,会使程序变得更通用,可以在任何实现了这些接口的类型上使用读写方法。 + +例如一个 `JPEG` 图形解码器,通过一个 `Reader` 参数,它可以解码来自磁盘、网络连接或以 `gzip` 压缩的 `HTTP` 流中的 `JPEG`图形数据,或者其他任何实现了`Reader` 接口的对象。 + +- [目录](directory.md) +- 上一章:[11.7 第一个例子:使用Sorter接口排序](11.7.md) +- 下一节:[11.9 空接口](11.9.md) \ No newline at end of file diff --git a/eBook/directory.md b/eBook/directory.md index 45f946c..3f42721 100644 --- a/eBook/directory.md +++ b/eBook/directory.md @@ -101,6 +101,7 @@ - 11.5 [娴嬭瘯涓涓兼槸鍚﹀疄鐜颁簡鏌愪釜鎺ュ彛](11.5.md) - 11.6 [浣跨敤鏂规硶闆嗕笌鎺ュ彛](11.6.md) - 11.7 [绗竴涓緥瀛愶細浣跨敤Sorter鎺ュ彛鎺掑簭](11.7.md) + - 11.8 [绗簩涓緥瀛愶細璇诲拰鍐橾(11.8.md) ## 绗笁閮ㄥ垎锛欸o 楂樼骇缂栫▼