GO語言之旅練習:rot13Reader
阿新 • • 發佈:2018-12-22
有種常見的模式是一個 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.