美文网首页
【A Tour of Go 练习】:rot13Reader

【A Tour of Go 练习】:rot13Reader

作者: 马蹄哒 | 来源:发表于2020-02-16 13:02 被阅读0次

有种常见的模式是一个 io.Reader 包装另一个 io.Reader,然后通过某种方式修改其数据流。

例如,gzip.NewReader 函数接受一个 io.Reader(已压缩的数据流)并返回一个同样实现了 io.Reader*gzip.Reader(解压后的数据流)。

编写一个实现了 io.Reader 并从另一个 io.Reader 中读取数据的 rot13Reader,通过应用 rot13 代换密码对数据流进行修改。

rot13Reader 类型已经提供。实现 Read 方法以满足 io.Reader

解答:

package main

import (
    "io"
    "os"
    "strings"
)

type rot13Reader struct {
    r io.Reader
}

func (rot rot13Reader) Read(p []byte) (int, error) {
    n, err := rot.r.Read(p)
    for i := 0; i < n; i++ {
        p[i] = rot13(p[i])
    }
    return n, err

}
func rot13(b byte) byte {
    if (b >= 'A' && b <= 'M') || (b >= 'a' && b <= 'm') {
        b += 13
    } else if (b >= 'N' && b <= 'Z') || (b >= 'n' && b <= 'z') {
        b -= 13
    }
    return b
}

func main() {
    s := strings.NewReader("Lbh penpxrq gur pbqr!")
    r := rot13Reader{s}
    io.Copy(os.Stdout, &r)
}

输出:

You cracked the code!
Program exited.

相关文章

网友评论

      本文标题:【A Tour of Go 练习】:rot13Reader

      本文链接:https://www.haomeiwen.com/subject/vgspfhtx.html