输入输出在任何一门语言中都必须提供的一个功能。
算法的实现离不开特定的语言,而算法有五个特性:
有穷性,确切性,输入项,输出项,可行性
五项就占了两项,说明输入输出在编程中是及其重要的地位。
Go的输入和输出是有两个接口定义的。只要实现了两个接口,才能说明这个对象是可以进行输入输出操作的。
这两个接口是:io.Writer
和io.Reader
io.Writer
接口声明如下
type Writer interface {
Write(p []byte) (n int, err error)
}
这个接口声明了唯一一个方法Write,这个方法接受一个byte切片,并返回两个值。第一个值是写入的字节数,第二个值是error错误值。
实现这个接口的注意事项: Write方法的实现需要试图写入被传入的byte切片里的所有数据。但是,如果无法全部写入,那么该方法就一定会返回一个错误。返回的写入字节数可能会小于byte切片的长度,但不会出现大于的情况。最后,不管什么情况,都不能修改byte切片里的数据。
io.Reader
type Reader interface {
Read(p []byte) (n int, err error)
}
这个方法接受一个byte切片,并返回两个值。第一个值是读入的字节数,第二个值是error错误值。
实现这个接口的注意事项:
标准库里列出了实现Read方法的4条规则。
第一条规则表明,该实现需要试图读取数据来填满被传入的byte切片。允许出现读取的字节数小于byte切片的长度,并且如果在读取时已经读到数据但是数据不足以填满byte切片时,不应该等待新数据,而是要直接返回已读数据。
第二条规则提供了应该如何处理达到文件末尾(EOF)的情况的指导。当读到最后一个字节时,可以有两种选择。一种是Read返回最终读到的字节数,并且返回EOF作为错误值,另一种是返回最终读到的字节数,并返回nil作为错误值。在后一种情况下,下一次读取的时候,由于没有更多的数据可供读取,需要返回0作为读到的字节数,以及EOF作为错误值。
第三条规则是给调用Read的人的建议。任何时候Read返回了读取的字节数,都应该优先处理这些读取到的字节,再去检查EOF错误值或者其他错误值。
最终,第四条约束建议Read方法的实现永远不要返回0个读取字节的同时返回nil作为错误值。如果没有读到值,Read应该总是返回一个错误。
示例
import (
"bytes"
"fmt"
"os"
)
func main() {
var b bytes.Buffer
b.Write([]byte("hello "))
fmt.Fprint(&b, "world")
b.WriteTo(os.Stdout)
}
输出:
hello world
参考文献:
《Go语言实战》
撩我?
搜索我的公众号:Kyda