mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-19 03:50:11 +08:00
@@ -277,4 +277,4 @@ t is now {77 Sunset Strip}
|
|||||||
|
|
||||||
- [目录](directory.md)
|
- [目录](directory.md)
|
||||||
- 上一节:[空接口](11.9.md)
|
- 上一节:[空接口](11.9.md)
|
||||||
- 下一节:[Printf和反射](11.11.md)
|
- 下一节:[Printf 和反射](11.11.md)
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.11 Printf和反射
|
# 11.11 Printf 和反射
|
||||||
|
|
||||||
在Go语言的标准库中,前几节所述的反射的功能被大量地使用。举个例子,fmt包中的Printf(以及其他格式化输出函数)都会使用反射来分析它的`...`参数。
|
在Go语言的标准库中,前几节所述的反射的功能被大量地使用。举个例子,fmt包中的Printf(以及其他格式化输出函数)都会使用反射来分析它的`...`参数。
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# 11.8 第二个例子:读和写
|
# 11.8 第二个例子:读和写
|
||||||
|
|
||||||
读和写是软件中很普遍的行为,提起它们会立即想到读写文件、缓存(比如字节或字符串切片)、标准输入输出、标准错误以及网络连接、管道等等,或者读写我们的自定义类型。为了是代码尽可能通用,Go 采取了一致的方式来读写数据。
|
读和写是软件中很普遍的行为,提起它们会立即想到读写文件、缓存(比如字节或字符串切片)、标准输入输出、标准错误以及网络连接、管道等等,或者读写我们的自定义类型。为了让代码尽可能通用,Go 采取了一致的方式来读写数据。
|
||||||
|
|
||||||
`io` 包提供了用于读和写的接口 `io.Reader` 和 `io.Writer`:
|
`io` 包提供了用于读和写的接口 `io.Reader` 和 `io.Writer`:
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ type Writer interface {
|
|||||||
|
|
||||||
只要类型实现了读写接口,提供 `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`)。
|
只要类型实现了读写接口,提供 `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章 我们会看在实战使用它们的很多例子。
|
`io` 包里的 `Readers` 和 `Writers` 都是不带缓冲的,`bufio` 包里提供了对应的带缓冲的操作,在读写 `UTF-8` 编码的文本文件时它们尤其有用。在 第12章 我们会看到很多在实战使用它们的例子。
|
||||||
|
|
||||||
在实际编程中尽可能的使用这些接口,会使程序变得更通用,可以在任何实现了这些接口的类型上使用读写方法。
|
在实际编程中尽可能的使用这些接口,会使程序变得更通用,可以在任何实现了这些接口的类型上使用读写方法。
|
||||||
|
|
||||||
|
@@ -209,7 +209,7 @@ func main() {
|
|||||||
|
|
||||||
## 11.9.5 接口到接口
|
## 11.9.5 接口到接口
|
||||||
|
|
||||||
一个接口的值可以赋值给另一个接口变量,只要底层类型实现了必要的方法。这个转换是在运行时进行检查的,转换失败会导致一个运行时错误:这是 'Go' 语言动态的一面,可以那它和 `Ruby` 和 `Python` 这些动态语言相比较。
|
一个接口的值可以赋值给另一个接口变量,只要底层类型实现了必要的方法。这个转换是在运行时进行检查的,转换失败会导致一个运行时错误:这是 'Go' 语言动态的一面,可以拿它和 `Ruby` 和 `Python` 这些动态语言相比较。
|
||||||
|
|
||||||
假定:
|
假定:
|
||||||
|
|
||||||
|
@@ -103,6 +103,8 @@
|
|||||||
- 11.7 [第一个例子:使用 Sorter 接口排序](11.7.md)
|
- 11.7 [第一个例子:使用 Sorter 接口排序](11.7.md)
|
||||||
- 11.8 [第二个例子:读和写](11.8.md)
|
- 11.8 [第二个例子:读和写](11.8.md)
|
||||||
- 11.9 [空接口](11.9.md)
|
- 11.9 [空接口](11.9.md)
|
||||||
|
- 11.10 [反射包](11.10.md)
|
||||||
|
- 11.11 [Printf 和反射](11.11.md)
|
||||||
|
|
||||||
## 第三部分:Go 高级编程
|
## 第三部分:Go 高级编程
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user