题目:

练习:rot13Reader

有种常见的模式是一个 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 (
// "errors" "io"
"os"
"strings"
) type rot13Reader struct {
r io.Reader
} func (r13 rot13Reader) Read(b []byte) (int, error) {
// temp_b := []byte{} 这里新造一个字节切片接受,会导致程序卡住
r, err := r13.r.Read(b)
for i, v := range b {
switch {
case 65 <= v && v <= 90:
new_v := v + 13
if new_v <= 90 {
b[i] = new_v
} else {
new_v = new_v - 26
b[i] = new_v
}
case 97 <= v && v <= 122:
new_v := v + 13
if new_v <= 122 {
b[i] = new_v
} else {
new_v = new_v - 26
b[i] = new_v
}
// 这里抛出异常也会卡住执行很久
// default:
// return 0, errors.New("not alphabet")
}
} return r, err } func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}

最新文章

  1. Coding Kata - 挑战你的“底线”
  2. ASP.NET MVC学习之Ajax(完结)
  3. Apache开启Proxy代理,实现域名端口转发
  4. ActiveMQ(5.10.0) - Connection Configuration URI
  5. 将vs2012的项目转化成VS2010
  6. UIResponder学习
  7. mui开发app之js将base64转图片文件
  8. 反射结合xml简单的模拟spring创建bean
  9. linux 开机批量启动程序
  10. SpringBoot更改HttpMessageConverters使用FastJson出现乱码问题
  11. PTA第四次作业
  12. ios用户登录记住密码
  13. zookeeper学习:知识点收集
  14. sql可重复执行语句例子
  15. day07作业
  16. varnish squid nginx比较
  17. C#使用Docx操作word文档
  18. C++中精确到小数点后任意位
  19. Vue 生产环境部署
  20. Linux系统服务管理 系统服务

热门文章

  1. CodeCraft-19 and Codeforces Round #537 (Div. 2) D 多重排列 + 反向01背包 + 离线处理
  2. MySQL处理表字段小技巧
  3. xtrabackup安装使用及原理
  4. 事件同步(一)-——CreateEvent( )事件对象实现线程同步
  5. MIT molecular Biology 笔记10 翻译
  6. .net MongoDB使用
  7. mysql_触发器
  8. Max Sum—hdu1003(简单DP) 标签: dp 2016-05-05 20:51 92人阅读 评论(0)
  9. Uncaught TypeError: Illegal invocation
  10. yum-163源配置