A Tour of Go部分练习

文章目录

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结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值