Golang 中的 bytes 包详解(二):bytes.Reader

Golang 中的 bytes 包是其中一个 IO 操作标准库,实现了对字节切片([]byte)的操作,提供了类似于 strings 包的功能。本文先讲解一下 bytes 包中的结构体 bytes.Reader。

bytes.Reader

bytes.Reader 实现了 io.Reader、io.ReaderAt、io.WriterTo、io.Seeker、io.ByteScanner 和 io.RuneScanner接口,提供了从字节切片中读取数据的功能。结构体定义和对应的方法如下:

type Reader struct {
	s        []byte
	i        int64 // current reading index
	prevRune int   // index of previous rune; or < 0
}

下面是 bytes.Reader 提供的方法:

  • func (r *Reader) Len() int,返回字节切片中未被读取的字节数。
  • func (r *Reader) Read(b []byte) (n int, err error),从 bytes.Reader 中读取数据并填充到 b 字节切片中。
  • func (r *Reader) ReadAt(b []byte, off int64) (n int, err error),类似于 Read,但使用偏移量 off 指定从哪里开始读取。
  • func (r *Reader) ReadByte() (byte, error),从字节切片中读取一个字节并返回。
  • func (r *Reader) ReadRune() (ch rune, size int, err error),从字节切片中读取一个 UTF-8 编码的字符,并返回该字符的 Unicode 编码点和字符长度。
  • func (r *Reader) Seek(offset int64, whence int) (int64, error),从字节切片中移动读取指针,offset 表示偏移量,whence 表示移动的基准位置。
  • func (r *Reader) UnreadByte() error,撤消最后一次读取操作并将读取指针向后移动一个字节。
  • func (r *Reader) UnreadRune() error,撤消最后一次读取操作并将读取指针向后移动一个 UTF-8 字符。
  • func (r *Reader) Size() int64,返回原始字节切片的长度。
  • func (r *Reader) Reset(b []byte),重置 Reader从 b 中读取数据
  • func (r *Reader) WriteTo(w io.Writer),写入数据到 w 中直到写完为止。

使用示例

package main

import (
	"bytes"
	"fmt"
)

func main() {
	data := []byte("路多辛的所思所想")
	reader := bytes.NewReader(data)

	// 读取整个字节数组
	buf := make([]byte, len(data))
	_, err := reader.Read(buf)
	if err != nil {
		fmt.Println("Read failed:", err)
	}
	fmt.Println("Bytes read:", buf)

	// 读取字节切片的一部分
	part := make([]byte, 3)
	_, err = reader.Read(part)
	if err != nil {
		fmt.Println("Read failed:", err)
	}
	fmt.Println("Bytes read:", part)

	// 查找并读取字节切片中的某个字符
	offset, err := reader.Seek(6, 0)
	if err != nil {
		fmt.Println("Seek failed:", err)
	}
	ch, size, err := reader.ReadRune()
	if err != nil {
		fmt.Println("ReadRune failed:", err)
	}
	fmt.Printf("Read %c with size %d at offset %d\n", ch, size, offset)
}

首先定义了一个字节切片 data,作为参数传入 bytes.NewReader 函数创建一个 reader 对象。然后使用 reader 对象的 Read 方法读取整个字节切片和一部分数据,并使用 Seek 和 ReadRune 方法查找字节切片中的某个字符并读取。

小结

bytes.Reader 可以很方便地处理和读取字节切片,可以像读取文件一样读取字节切片中的数据,功能非常强大和实用。

猜你喜欢

转载自blog.csdn.net/luduoyuan/article/details/131464806