Go源码学习:bytes包 - 1.1 - buffer.go -(1)

bytes包官方文档

Go源码学习-索引目录

1、Buffer:用于数据序列化的简单字节缓冲区

// Buffer 是一个具有[Buffer.Read]和[Buffer.Write]方法的可变大小的字节缓冲区。
// Buffer的零值是一个空缓冲区,可以立即使用。
type Buffer struct {
    buf      []byte // 内容为buf[off:len(buf)]的字节
    off      int    // 读取位置为&buf[off],写入位置为&buf[len(buf)]
    lastRead readOp // 最后一次读取的操作,以便Unread*能够正确工作。
}

解释:

  • Buffer 是一个结构体类型,表示一个可变大小的字节缓冲区,提供了读取和写入方法。
  • buf 字段存储实际的字节内容,off 字段表示当前读取的位置,lastRead 字段用于跟踪最后一次读取的操作。
  • 零值的 Buffer 是一个空缓冲区,可以直接使用。

作用:

  • Buffer 主要用于在内存中操作字节数据,支持读取和写入操作。

2、smallBufferSize:初始分配的最小容量

// smallBufferSize 是初始分配的最小容量。
const smallBufferSize = 64

解释:

  • smallBufferSize 是一个常量,表示初始分配的最小容量,用于缓冲区的初次分配。

作用:

  • 该常量用于设置缓冲区的初始大小,提供了一个较小但合理的默认容量。

3、readOp:描述最后一次对缓冲区执行的读取操作

// The readOp constants describe the last action performed on
// the buffer, so that UnreadRune and UnreadByte can check for
// invalid usage. opReadRuneX constants are chosen such that
// converted to int they correspond to the rune size that was read.
type readOp int8

// 不要使用iota,因为这些值需要与名称和注释对应,明确指定更容易查看。
const (
    opRead      readOp = -1 // 任何其他读取操作。
    opInvalid   readOp = 0  // 非读取操作。
    opReadRune1 readOp = 1  // 读取大小为1的rune。
    opReadRune2 readOp = 2  // 读取大小为2的rune。
    opReadRune3 readOp = 3  // 读取大小为3的rune。
    opReadRune4 readOp = 4  // 读取大小为4的rune。
)

解释:

  • readOp 是一个枚举类型,描述对缓冲区执行的最后一次读取操作。
  • 定义了一些常量,如opRead表示任何其他读取操作,opInvalid表示非读取操作,opReadRuneX表示读取rune的大小。

作用:

  • 该类型用于在缓冲区中跟踪最后一次读取操作,以便UnreadRuneUnreadByte可以检查无效的使用。

4、ErrTooLarge:内存无法分配时抛出的错误

// ErrTooLarge 在内存无法分配足够存储数据的情况下,传递给panic。
var ErrTooLarge = errors.New("bytes.Buffer: too large")

解释:

  • ErrTooLarge 是一个错误变量,表示在无法分配足够内存以存储数据时,将传递给panic的错误。

作用:

  • 该错误用于标识尝试分配过大内存时的异常情况。

5、errNegativeRead:读取返回负数时抛出的错误

var errNegativeRead = errors.New("bytes.Buffer: reader returned negative count from Read")

解释:

  • errNegativeRead 是一个错误变量,表示当读取返回负数时抛出的错误。

作用:

  • 该错误用于标识从读取操作中获得负数的异常情况。

6、maxInt:int类型的最大值

const maxInt = int(^uint(0) >> 1)

解释:

  • maxInt 是一个常量,表示int类型的最大值,通过位运算计算得到。

作用:

  • 该常量用于表示整数类型的最大值,通常在处理边界情况时使用。

7、Bytes:返回缓冲区未读部分的字节切片

// Bytes 返回长度为 b.Len() 的切片,其中包含缓冲区未读部分的内容。
// 该切片仅在下一次缓冲区修改之前有效(即,仅在下一次调用诸如 [Buffer.Read]、[Buffer.Write]、[Buffer.Reset] 或 [Buffer.Truncate] 等方法之前有效)。
// 该切片至少与缓冲区内容共享内存,因此立即对切片进行的更改将影响未来读取的结果。
func (b *Buffer) Bytes() []byte { return b.buf[b.off:] }

解释:

  • Bytes 方法是一个 Buffer 结构体的方法,返回一个长度为 b.Len() 的切片,其中包含了缓冲区中未读部分的内容。
  • 返回的切片仅在下一次缓冲区修改之前有效,即在下一次调用诸如 Buffer.ReadBuffer.WriteBuffer.ResetBuffer.Truncate 等方法之前有效。
  • 该切片与缓冲区内容共享内存,因此立即对切片进行的更改将影响未来读取的结果。

作用:

  • Bytes 方法用于获取缓冲区中未读部分的内容,并以切片的形式返回,允许读取未读取的数据。

8、AvailableBuffer:返回具有预留容量的空缓冲区

// AvailableBuffer 返回具有 b.Available() 容量的空缓冲区。
// 此缓冲区预期用于追加,并传递给紧随其后的 [Buffer.Write] 调用。
// 该缓冲区仅在对 b 的下一次写操作之前有效。
func (b *Buffer) AvailableBuffer() []byte { return b.buf[len(b.buf):] }

解释:

  • AvailableBuffer 方法是一个 Buffer 结构体的方法,返回一个具有 b.Available() 容量的空缓冲区。
  • 此缓冲区预期用于追加数据,并传递给紧随其后的 Buffer.Write 调用。
  • 返回的缓冲区仅在对 b 的下一次写操作之前有效。

作用:

  • AvailableBuffer 方法用于获取一个预留容量的空缓冲区,以便用于追加数据。

9、String:返回缓冲区未读部分的字符串表示

// String 将缓冲区未读部分的内容作为字符串返回。
// 如果 [Buffer] 是一个 nil 指针,则返回 "<nil>"。
//
// 要更高效地构建字符串,请参见 strings.Builder 类型。
func (b *Buffer) String() string {
    if b == nil {
        // 特殊情况,在调试中很有用。
        return "<nil>"
    }
    return string(b.buf[b.off:])
}

解释:

  • String 方法是一个 Buffer 结构体的方法,返回缓冲区中未读部分的字符串表示。
  • 如果 Buffer 是一个空指针,则返回 <nil>
  • 建议更高效地构建字符串时,可以参考 strings.Builder 类型。

作用:

  • String 方法用于将缓冲区中未读部分的内容作为字符串返回,方便获取未读取数据的字符串表示形式。

10、empty:判断缓冲区未读部分是否为空

// empty 报告缓冲区未读部分是否为空。
func (b *Buffer) empty() bool { return len(b.buf) <= b.off }

解释:

  • empty 方法是一个 Buffer 结构体的方法,用于判断缓冲区中未读部分是否为空。
  • 返回值为布尔类型,如果未读部分为空,则返回 true,否则返回 false

作用:

  • empty 方法用于检查缓冲区中未读部分是否为空,帮助确定是否还有可读取的数据。
  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风不归Alkaid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值