环境
go version go1.10.1 darwin/amd64
Reader
io 包指定了 io.Reader 接口, 它表示从数据流的末尾进行读取。
Go 标准库包含了该接口的许多实现, 包括文件、网络连接、压缩和加密等等。
io.Reader 接口有一个 Read 方法:
func (T) Read(b []byte) (n int, err error)
Read 用数据填充给定的字节切片并返回填充的字节数和错误值。 在遇到数据流的结尾时,它会返回一个 io.EOF 错误。实例演示如下
package main
import (
"fmt"
"io"
"strings"
)
func main() {
r := strings.NewReader("Come! World!")
b := make([]byte, 8)
for {
n, err := r.Read(b)
fmt.Printf("n = %v err = %v b = %v\n", n, err, b)
fmt.Printf("b[:n] = %q\n", b[:n])
if err == io.EOF {
break
}
}
}
示例代码创建了一个 strings.Reader 并以每次 8 字节的速度读取它的输出。
练习:Reader
实现一个 Reader 类型,它产生一个 ASCII 字符 'A' 的无限流。
package main
import "github.com/Go-zh/tour/reader"
type MyReader struct{}
// TODO: Add a Read([]byte) (int, error) method to MyReader.
func (a MyReader) Read(b []byte) (int, error) {
b[0] = 'A'
return 1, nil // 1表示一个字符
}
func main() {
reader.Validate(MyReader{})
}
练习:rot13Reader
有种常见的模式是一个 io.Reader 包装另一个 io.Reader ,然后通过某种方式修改其数据流。
例如,gzip.NewReader 函数接受一个 io.Reader (已压缩的数据流)并返回一个同样实现了 io.Reader 的 *gzip.Reader (解压后的数据流)。
编写一个实现了 io.Reader 并从另一个 io.Reader 中读取数据的 rot13Reader , 通过应用 rot13 代换密码对数据流进行修改。
rot13Reader 类型已经提供。实现 Read 方法以满足 io.Reader 。关于rot13的解释,可以到ROT13了解。我的练习如下
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (r *rot13Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
if err != nil {
return n, err
}
for i := 0; i < len(b); i++ {
if (b[i] >= 'A' && b[i] <= 'M') || (b[i] >= 'a' && b[i] <= 'm') {
b[i] += 13
} else if (b[i] >= 'N' && b[i] <= 'Z') || (b[i] >= 'n' && b[i] <= 'z') {
b[i] -= 13
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
我们主要实现的逻辑是下面的逻辑
---------------------------------------------------------
输入|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
---------------------------------------------------------
输出|NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
---------------------------------------------------------
输入A的时候我们要转换N,依次类推
版权声明
由 durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。