美文网首页
【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