练习题目:
A common pattern is an io.Reader that wraps another io.Reader, modifying the stream in some way.
For example, the gzip.NewReader function takes an io.Reader (a stream of compressed data) and returns a *gzip.Reader that also implements io.Reader (a stream of the decompressed data).
Implement a rot13Reader that implements io.Reader and reads from an io.Reader, modifying the stream by applying the rot13 substitution cipher to all alphabetical characters.
The rot13Reader type is provided for you. Make it an io.Reader by implementing its Read method.
练习程序:
package mainimport ("io""os""strings"
)type rot13Reader struct {r io.Reader
}func rot13(x byte) byte {switch {case x >= 65 && x <= 77:fallthroughcase x >= 97 && x <= 109:x = x + 13case x >= 78 && x <= 90:fallthroughcase x >= 110 && x <= 122:x = x - 13}return x
}func (rot rot13Reader) Read(a []byte) (int, error) {n, err := rot.r.Read(a)for key, value := range(a) {a[key] = rot13(value)}return n, err
}func main() {s := strings.NewReader("Lbh penpxrq gur pbqr!")r := rot13Reader{s}io.Copy(os.Stdout, &r)
}
运行结果:
You cracked the code!
学习笔记:
该题目是对于GO中Read方法的进阶练习,GO中常用的一种方式是用一个io.Reader去封装另一个io.Reader,这样可以实现很多功能,比如可以先通过里层的io.Reader从加密的文本中先读取加密字符,然后在外层的io.Reader的Read方法中实现解密并输出,这样就完成了一种直接读取解密文本的能力。本题目就是类似的场景,使用的加密算法是比较简单的ROT13字符替换加密法。