1. 程式人生 > >GO語言之旅練習:rot13Reader

GO語言之旅練習: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 (
	"io"
	"os"
	"strings"
)

type rot13Reader struct {
	r io.Reader
}

func (t *rot13Reader) Read(b []byte) (int, error) {
	n, err := t.r.Read(b)
	for i := 0; i < n; i++ {
		switch {
		case b[i] >= 'A' && b[i] < 'N' || b[i] >= 'a' && b[i] < 'n':
			b[i] += 13
		case 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)
}

結果如下:

You cracked the code!
Program exited.