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

这篇具有很好参考价值的文章主要介绍了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 可以很方便地处理和读取字节切片,可以像读取文件一样读取字节切片中的数据,功能非常强大和实用。文章来源地址https://www.toymoban.com/news/detail-527227.html

到了这里,关于Golang 中的 bytes 包详解(二):bytes.Reader的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang 中的接口详解

    什么是接口:接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 在Go语言中接口(interface)是一种类型,一种抽象的类型。 interface是一组method的集合,是duck-type programming的一种体现。 接口做的事情就像是定义一个协议(规则

    2024年02月13日
    浏览(35)
  • Golang 中的 map 详解

    1、map 的定义   在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 key, value 对组成的抽象数据结构,并且同一个 key 只会出现一次。   两个关键点:map 是由 key-value 对组成的;key 只会出现一次。   map 的设计也被称为 “The dictionary problem(字典问题)

    2024年02月14日
    浏览(47)
  • 一步步带你剖析Java中的Reader类

    本文分享自华为云社区《深入理解Java中的Reader类:一步步剖析》,作者:bug菌。 在Java开发过程中,我们经常需要读取文件中的数据,而数据的读取需要一个合适的类进行处理。Java的IO包提供了许多类用于数据的读取和写入,其中Reader便是其中之一。本文将对Java中的Reader进行

    2024年02月08日
    浏览(29)
  • Golang 中的信号(Signal)机制详解

    目录 信号基础概念 Golang 对信号的处理 信号处理的使用场景和使用示例 信号的局限性 Go 中的特殊信号处理 小结 Signal 是一种操作系统级别的事件通知机制,进程可以响应特定的系统信号。这些信号用于指示进程执行特定的操作,如程序终止、挂起、恢复等。Golang 的标准库

    2024年01月16日
    浏览(40)
  • Golang 中的 bufio 包详解(五):常用函数

    Golang 中的 bufio 包是带缓冲 I/O 操作的标准库,之前的几篇文章详细讲解了 bufio.Reader、bufio.Writer 和 bufio.Scanner 这个几个结构体的使用方法、特性和使用场景,本文介绍一下 bufio 包中的函数。 介绍常用函数之前,先简单介绍下另一个结构体类型和一个函数类型:bufio.ReadWriter

    2024年02月11日
    浏览(35)
  • Golang 中的 io 包详解(二):组合接口

    Golang 中,接口可以通过嵌入多个其他接口组成组合接口。组合接口表示的是子接口的集合,具有所有子接口的方法,可以通过组合多个不同的接口组成一个更强大的抽象。本文主要介绍下 io 包中的组合接口。 是对Reader和Writer接口的组合,聚合了基本的读写操作。简单示例如

    2024年02月08日
    浏览(40)
  • Golang 中的 archive/zip 包详解(二):常用类型

    Golang 中的 archive/zip 包用于处理 ZIP 格式的压缩文件,提供了一系列用于创建、读取和解压缩 ZIP 格式文件的函数和类型,使用起来非常方便。 定义如下: 表示一个 ZIP 文件中的单个文件的信息,文件的元数据信息,例如文件名、文件大小、修改时间等包含在 FileHeader 中,有

    2024年02月11日
    浏览(38)
  • Golang 中的 time 包详解(二):time.Duration

    在日常开发过程中,会频繁遇到对时间进行操作的场景,使用 Golang 中的 time 包可以很方便地实现对时间的相关操作。接下来的几篇文章会详细讲解 time 包,本文讲解一下 time 包中的 time.Duration 类型。 time.Duration 类型是一个有符号的 int64 类型,以纳秒为单位,用来表示两个时

    2024年02月15日
    浏览(40)
  • Golang 中的 time 包详解(一):time.Time

    在日常开发过程中,会频繁遇到对时间进行操作的场景,使用 Golang 中的 time 包可以很方便地实现对时间的相关操作。接下来的几篇文章会详细讲解 time 包,本文先讲解一下 time 包中的结构体 time.Time。 time.Time 类型用来表示一个具体的时间点,可以精确到纳秒。结构体定义和

    2024年02月15日
    浏览(41)
  • Golang 中的 archive/zip 包详解(三):常用函数

    Golang 中的 archive/zip 包用于处理 ZIP 格式的压缩文件,提供了一系列用于创建、读取和解压缩 ZIP 格式文件的函数和类型,使用起来非常方便,本文讲解下常用函数。 定义如下: 打开一个 ZIP 文件,并返回一个 zip.ReadCloser 类型的对象。简单使用示例如下: 定义如下: 创建一个

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包