函数作用
NewReader创建一个从s读取数据的Reader
type Reader struct {
s string //对应的字符串
i int64 // 当前读取到的位置
prevRune int
}
Len,Size,Read方法
Len作用: 返回未读的字符串长度
Size的作用:返回字符串的长度
read的作用: 读取字符串信息
r := strings.NewReader("abcdefghijklmn")
fmt.Println(r.Len()) // 输出14 初始时,未读长度等于字符串长度
var buf []byte
buf = make([]byte, 5)
readLen, err := r.Read(buf)
fmt.Println("读取到的长度:", readLen) //读取到的长度5
if err != nil {
fmt.Println("错误:", err)
}
fmt.Println(buf) //adcde
fmt.Println(r.Len()) //9 读取到了5个 剩余未读是14-5
fmt.Println(r.Size()) //14 字符串的长度
ReadAt方法
声明
func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
作用
读取偏移off字节后的剩余信息到b中(需要注意的是,ReadAt函数不会影响Len的数值,和Read的数值,off不能为负数,不能大于size()的长度)
r := strings.NewReader("abcdefghijklmn")
var bufAt, buf []byte
buf = make([]byte, 5)
r.Read(buf)
fmt.Println("剩余未读的长度", r.Len()) //剩余未读的长度 9
fmt.Println("已读取的内容", string(buf)) //已读取的内容 abcde
bufAt = make([]byte, 256)
r.ReadAt(bufAt, 5)
fmt.Println(string(bufAt)) //fghijklmn
//测试下是否影响Len和Read方法
fmt.Println("剩余未读的长度", r.Len()) //剩余未读的长度 9
fmt.Println("已读取的内容", string(buf)) //已读取的内容 abcde
ReadByte,UnreadByte方法
声明
func (r *Reader) ReadByte() (b byte, err error)
func (r *Reader) UnreadRune() error
作用
ReadByte从当前已读取位置继续读取一个字节
UnreadByte将当前已读取位置回退一位,当前位置的字节标记成未读取字节
r := strings.NewReader("abcdefghijklmn")
//读取一个字节
b, _ := r.ReadByte()
fmt.Println(string(b)) // a
//int(r.Size()) - r.Len() 已读取字节数
fmt.Println(int(r.Size()) - r.Len()) // 1
//读取一个字节
b, _ = r.ReadByte()
fmt.Println(string(b)) // b
fmt.Println(int(r.Size()) - r.Len()) // 2
//回退一个字节
r.UnreadByte()
fmt.Println(int(r.Size()) - r.Len()) // 1
//读取一个字节
b, _ = r.ReadByte()
fmt.Println(string(b)) // b
Seek方法
声明
func (r *Reader) Seek(offset int64, whence int) (int64, error)
作用
前面有ReadAt方法可以将字符串偏移多少位读取剩下的字符串内容,但是该方法不会影响正在用Read方法读取的内容,如果相对Read方法读取的内容做偏移就可以使用seek方法, offset是偏移的位置,whence是偏移起始位置,支持三种位置(io.SeekStart起始位,io.SeekCurrent当前位,io.SeekEnd末位)。需要注意的是offset可以未负数,当时偏移起始位 与offset相加得到的值不能小于0或者大于size()的长度
r := strings.NewReader("abcdefghijklmn")
var buf []byte
buf = make([]byte, 5)
r.Read(buf)
fmt.Println(string(buf)) //adcde
buf = make([]byte, 5)
r.Seek(-2, io.SeekCurrent) //从当前位置向前偏移两位 (5-2)
r.Read(buf)
fmt.Println(string(buf)) //defgh
buf = make([]byte, 5)
r.Seek(-3, io.SeekEnd) //设置当前位置是末尾前移三位
r.Read(buf)
fmt.Println(string(buf)) //lmn
buf = make([]byte, 5)
r.Seek(3, io.SeekStart) //设置当前位置是起始位后移三位
r.Read(buf)
fmt.Println(string(buf)) //defgh