上一篇:
Go源码学习:bytes包 - 1.2 - buffer.go -(3)
// UnreadRune 撤销最后一个由 [Buffer.ReadRune] 返回的符文。
// 如果缓冲区上最近的读取或写入操作不是成功的 [Buffer.ReadRune],UnreadRune 将返回错误。
// (在这方面,它比 [Buffer.UnreadByte] 更严格,后者将从任何读取操作中撤消最后一个字节。)
func (b *Buffer) UnreadRune() error {
// 如果最近的读取操作无效,表示不是成功的 ReadRune,返回错误。
if b.lastRead <= opInvalid {
return errors.New("bytes.Buffer: UnreadRune: previous operation was not a successful ReadRune")
}
// 如果读取偏移量超过了最近读取的位置,将偏移量减去最近读取的位置。
if b.off >= int(b.lastRead) {
b.off -= int(b.lastRead)
}
// 将最近读取的标志设为无效。
b.lastRead = opInvalid
return nil
}
解释:
UnreadRune
方法是 Buffer
结构体的方法,用于撤销最后一个由 Buffer.ReadRune
返回的符文。ReadRune
,如果不是,返回相应错误。作用:
UnreadRune
方法用于在符文读取后撤销该符文,以便重新读取。ReadRune
,确保只有成功读取的符文才能被撤销。var errUnreadByte = errors.New("bytes.Buffer: UnreadByte: previous operation was not a successful read")
// UnreadByte 撤销最后一个由最近成功读取的操作返回的字节。
// 如果自上次读取以来发生写入,如果最后一次读取返回错误,或者如果读取了零字节,UnreadByte 将返回错误。
func (b *Buffer) UnreadByte() error {
// 如果最近的读取操作无效,表示不是成功的读取,返回相应错误。
if b.lastRead == opInvalid {
return errUnreadByte
}
// 将最近读取的标志设为无效。
b.lastRead = opInvalid
// 如果偏移量大于零,将偏移量减一。
if b.off > 0 {
b.off--
}
return nil
}
解释:
UnreadByte
方法是 Buffer
结构体的方法,用于撤销最后一个由最近成功读取的操作返回的字节。作用:
UnreadByte
方法用于在字节读取后撤销该字节的读取,以便重新读取。// ReadBytes 读取输入中第一个定界符之前的数据,
// 返回一个包含数据和定界符的切片。
// 如果在找到定界符之前发生错误,返回错误之前读取的数据和错误本身(通常是 io.EOF)。
// 当且仅当返回的数据不以定界符结束时,ReadBytes 返回 err != nil。
func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) {
// 调用 readSlice 方法获取切片和错误。
slice, err := b.readSlice(delim)
// 返回切片的副本。缓冲区的底层数组可能被后续调用覆盖。
line = append(line, slice...)
return line, err
}
解释:
ReadBytes
方法是 Buffer
结构体的方法,用于读取输入中第一个定界符之前的数据,并返回包含数据和定界符的切片。readSlice
方法获取切片和可能的错误。作用:
ReadBytes
方法用于读取数据直到指定定界符,并返回包含定界符在内的数据切片。// readSlice 类似于 ReadBytes,但返回对内部缓冲区数据的引用。
func (b *Buffer) readSlice(delim byte) (line []byte, err error) {
// 在当前读取偏移量 b.off 后的缓冲区中查找定界符的索引。
i := IndexByte(b.buf[b.off:], delim)
// 计算定界符的结束位置。
end := b.off + i + 1
// 如果没有找到定界符,设置结束位置为缓冲区末尾,并将错误设置为 io.EOF。
if i < 0 {
end = len(b.buf)
err = io.EOF
}
// 提取从当前偏移量到结束位置的数据切片。
line = b.buf[b.off:end]
// 更新偏移量和最近读取的标志。
b.off = end
b.lastRead = opRead
return line, err
}
解释:
readSlice
方法类似于 ReadBytes
,但返回对内部缓冲区数据的引用。b.off
后的缓冲区中查找定界符的索引。io.EOF
。作用:
readSlice
方法用于读取数据直到指定定界符,并返回对内部缓冲区数据的引用。// ReadString 读取输入中第一个定界符之前的数据,
// 返回一个包含数据和定界符的字符串。
// 如果在找到定界符之前发生错误,返回错误之前读取的数据和错误本身(通常是 io.EOF)。
// 当且仅当返回的数据不以定界符结束时,ReadString 返回 err != nil。
func (b *Buffer) ReadString(delim byte) (line string, err error) {
// 调用 readSlice 方法获取切片和错误。
slice, err := b.readSlice(delim)
// 将切片转换为字符串。
return string(slice), err
}
解释:
ReadString
方法是 Buffer
结构体的方法,用于读取输入中第一个定界符之前的数据,并返回包含数据和定界符的字符串。readSlice
方法获取切片和可能的错误。作用:
ReadString
方法用于读取数据直到指定定界符,并返回包含定界符在内的字符串。// NewBuffer 创建并初始化一个新的 [Buffer],使用 buf 作为其初始内容。
// 新的 [Buffer] 接管 buf,并且调用方在此调用后不应再使用 buf。
// NewBuffer 用于准备 [Buffer] 以读取现有数据。也可以用于设置用于写入的内部缓冲区的初始大小。
// 为了实现这一点,buf 应具有所需容量但长度为零。
//
// 在大多数情况下,new([Buffer])(或只是声明 [Buffer] 变量)足以初始化 [Buffer]。
func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} }
解释:
NewBuffer
函数创建并初始化一个新的 Buffer
,使用 buf
作为其初始内容。Buffer
接管 buf
,调用方在此调用后不应再使用 buf
。Buffer
以读取现有数据,也可以用于设置用于写入的内部缓冲区的初始大小。作用:
NewBuffer
用于创建和初始化新的缓冲区,可以指定初始内容。// NewBufferString 创建并初始化一个新的 [Buffer],使用字符串 s 作为其初始内容。
// 用于准备缓冲区以读取现有字符串。
//
// 在大多数情况下,new([Buffer])(或只是声明 [Buffer] 变量)足以初始化 [Buffer]。
func NewBufferString(s string) *Buffer {
return &Buffer{buf: []byte(s)}
}
解释:
NewBufferString
函数创建并初始化一个新的 Buffer
,使用字符串 s
作为其初始内容。作用:
NewBufferString
用于创建和初始化新的缓冲区,可以指定初始内容为字符串。