文章目录
Reader 练习
实现io.Reader接口, 示例1
https://golang.google.cn/tour/methods/22
package main
import (
//"golang.org/x/tour/reader"
"fmt"
"strings"
)
type MyReader struct{}
// TODO: Add a Read([]byte) (int, error) method to MyReader.
type ErrEmptyBuffer []byte
func (b ErrEmptyBuffer) Error() string {
return fmt.Sprintf("cannot read empty buffer")
}
func (mr MyReader) Read (b []byte) (int, error) {
fmt.Println("--- :", b)
bLength := len(b)
fmt.Println("+++ :", bLength)
if bLength > 0 {
for i := range b {
b[i] = 'A'
}
fmt.Println("... :", b)
return bLength, nil
} else {
return 0, ErrEmptyBuffer(b)
}
}
func main() {
//reader.Validate(MyReader{})
r := MyReader{}
str := strings.NewReader("Hello, Reader!")
c := make([]byte, 8)
str.Read(c)
_, err := r.Read(c)
fmt.Println("pppp :",err)
d := make([]byte, 0)
_, err2 := r.Read(d)
fmt.Println("pppp :",err2)
}
输出
--- : [72 101 108 108 111 44 32 82]
+++ : 8
... : [65 65 65 65 65 65 65 65]
pppp : <nil>
--- : []
+++ : 0
pppp : cannot read empty buffer
实现io.Reader接口, 示例2. (更多其它结果,查看:tour-of-go-exercise-23-rot13reade)
https://golang.google.cn/tour/methods/23
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func rot13(val byte) byte {
if val >= 'a' && val <= 'z' {
val = (val-'a'+13)%26 + 'a'
} else if val >= 'A' && val <= 'Z' {
val = (val-'A'+13)%26 + 'A'
}
return val
}
func (reader *rot13Reader) Read(b []byte) (n int, err error) {
n, err = reader.r.Read(b)
for i := range b {
b[i] = rot13(b[i])
}
return n, err
}
func main() {
//s := strings.NewReader("Lbh penpxrq gur pbqr!")
sl := strings.NewReader("abcdefghijklmnopqrstuvwxyz!")
rl := rot13Reader{sl}
io.Copy(os.Stdout, &rl)
sC := strings.NewReader("ABCDEFGHIJKLMNOPQRSTUVWXYZ!")
rC := rot13Reader{sC}
io.Copy(os.Stdout, &rC)
}
输出
nopqrstuvwxyzabcdefghijklm!NOPQRSTUVWXYZABCDEFGHIJKLM!
扩展: rot13 算法: ROT13, 在线验证rot13结果