golang strings包NewReader方法

函数作用

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将当前已读取位置回退一位,当前位置的字节标记成未读取字节

扫描二维码关注公众号,回复: 6158589 查看本文章
	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

猜你喜欢

转载自blog.csdn.net/u014270740/article/details/89436719