跳到主要内容

bufio

bufio 库是 Go 标准库 bufio 的 yak 封装,提供带缓冲的读写器与扫描器,用于高效地按行/按块处理 I/O 流(文件、网络连接、内存缓冲等)。

典型使用场景:

  • 读取:bufio.NewReader / bufio.NewReaderSize 创建带缓冲读取器,bufio.NewScanner 创建按行/按 token 扫描器逐段读取大流。
  • 写入:bufio.NewWriter / bufio.NewWriterSize 创建带缓冲写入器,bufio.NewReadWriter 组合读写。
  • 缓冲与管道:bufio.NewBuffer 创建内存字节缓冲,bufio.NewPipe 创建内存管道(一端写、一端读)。

与相邻库的关系:bufio 是底层 I/O 工具,常与 iofiletcp/udp 等配合,用于流式读取网络/文件数据而不一次性占满内存。

共 8 个函数

函数索引

函数参数返回值说明
bufio.NewPipe-*bufpipe.PipeReader, *bufpipe.PipeWriter创建一个内存管道,返回配对的 PipeReader 与 PipeWriter(导出名为 bufio.NewPipe)
bufio.NewReadWriteri any, i2 any*bufio.ReadWriter, error根据传入的 Reader 和 Writer 创建一个带缓冲的 ReadWriter(导出名为 bufio.NewReadWriter)
bufio.NewReaderSizei any, size int*bufio.Reader, error根据传入的 Reader 创建一个指定缓冲区大小的带缓冲 Reader(导出名为 bufio.NewReaderSize)
bufio.NewScanneri any*bufio.Scanner, error根据传入的 Reader 创建一个 Scanner(导出名为 bufio.NewScanner)
bufio.NewWriterSizei any, size int*bufio.Writer, error根据传入的 Writer 创建一个指定缓冲区大小的带缓冲 Writer(导出名为 bufio.NewWriterSize)

可变参数函数索引

函数参数返回值说明
bufio.NewBufferb ...[]byte*bytes.Buffer创建一个新的 Buffer 结构体引用,其帮助我们处理字符串(导出名为 bufio.NewBuffer)
bufio.NewReaderraw ...any*bufio.Reader, error根据传入的 Reader 创建一个新的带缓冲 Reader(导出名为 bufio.NewReader)
bufio.NewWriterraw ...any*bufio.Writer, error根据传入的 Writer 创建一个新的带缓冲 Writer(导出名为 bufio.NewWriter)

函数详情

NewPipe

NewPipe() (*bufpipe.PipeReader, *bufpipe.PipeWriter)

创建一个内存管道,返回配对的 PipeReader 与 PipeWriter(导出名为 bufio.NewPipe)

写入端写入的数据可从读取端读出,常用于在协程间传递流式数据

返回值

序号类型说明
r1*bufpipe.PipeReader管道读取端 PipeReader
r2*bufpipe.PipeWriter管道写入端 PipeWriter

示例

r, w = bufio.NewPipe()
go func() { w.Write("Hello World"); w.Close() }()
data = io.ReadAll(r)~
println(string(data)) // OUT: Hello World
assert string(data) == "Hello World", "NewPipe should transfer data from writer to reader"

NewReadWriter

NewReadWriter(i any, i2 any) (*bufio.ReadWriter, error)

根据传入的 Reader 和 Writer 创建一个带缓冲的 ReadWriter(导出名为 bufio.NewReadWriter)

ReadWriter 可同时调用带缓冲 Reader 与 Writer 的方法

参数

参数名类型说明
iany底层 io.Reader
i2any底层 io.Writer

返回值

序号类型说明
r1*bufio.ReadWriter带缓冲的 ReadWriter 对象
r2error错误信息(任一参数类型不符时返回)

示例

rw = bufio.NewReadWriter(bufio.NewBuffer("input"), bufio.NewBuffer())~
line = rw.ReadString('t')~
println(line) // OUT: input
assert line == "input", "NewReadWriter should read from the underlying reader"

NewReaderSize

NewReaderSize(i any, size int) (*bufio.Reader, error)

根据传入的 Reader 创建一个指定缓冲区大小的带缓冲 Reader(导出名为 bufio.NewReaderSize)

常用方法:Read, ReadByte, ReadBytes, ReadLine, ReadString, Reset

参数

参数名类型说明
iany底层 io.Reader
sizeint缓冲区大小(字节)

返回值

序号类型说明
r1*bufio.Reader带缓冲的 Reader 对象
r2error错误信息(传入类型非 io.Reader 时返回)

示例

reader = bufio.NewReaderSize(bufio.NewBuffer("abcdef"), 1024)~
part = reader.ReadString('c')~
println(part) // OUT: abc
assert part == "abc", "NewReaderSize ReadString should read up to delimiter c"

NewScanner

NewScanner(i any) (*bufio.Scanner, error)

根据传入的 Reader 创建一个 Scanner(导出名为 bufio.NewScanner)

Scanner 默认按行切分输入,常用方法:Scan, Text, Err, Split, SplitFunc

参数

参数名类型说明
iany底层 io.Reader

返回值

序号类型说明
r1*bufio.ScannerScanner 对象
r2error错误信息(传入类型非 io.Reader 时返回)

示例

scanner = bufio.NewScanner(bufio.NewBuffer("a\nb\nc"))~
count = 0
for scanner.Scan() { count++ }
println(count) // OUT: 3
assert count == 3, "NewScanner should iterate over 3 lines"

NewWriterSize

NewWriterSize(i any, size int) (*bufio.Writer, error)

根据传入的 Writer 创建一个指定缓冲区大小的带缓冲 Writer(导出名为 bufio.NewWriterSize)

常用方法:Write, WriteByte, WriteString, Reset, Flush

参数

参数名类型说明
iany底层 io.Writer
sizeint缓冲区大小(字节)

返回值

序号类型说明
r1*bufio.Writer带缓冲的 Writer 对象
r2error错误信息(传入类型非 io.Writer 时返回)

示例

sink = bufio.NewBuffer()
writer = bufio.NewWriterSize(sink, 1024)~
writer.WriteString("hello yak")
writer.Flush()
println(sink.String()) // OUT: hello yak
assert sink.String() == "hello yak", "NewWriterSize should flush buffered data to the sink"

可变参数函数详情

NewBuffer

NewBuffer(b ...[]byte) *bytes.Buffer

创建一个新的 Buffer 结构体引用,其帮助我们处理字符串(导出名为 bufio.NewBuffer)

Buffer 同时实现了 Reader 和 Writer 接口

常用方法:Bytes, String, Read, Write, WriteString, WriteByte, Reset

可选参数

参数名类型说明
b...[]byte可选的初始内容字节

返回值

序号类型说明
r1*bytes.Buffer新建的 Buffer 对象

示例

buffer = bufio.NewBuffer()
buffer.WriteString("hello yak")
println(buffer.String()) // OUT: hello yak
assert buffer.String() == "hello yak", "NewBuffer should hold written content"

NewReader

NewReader(raw ...any) (*bufio.Reader, error)

根据传入的 Reader 创建一个新的带缓冲 Reader(导出名为 bufio.NewReader)

常用方法:Read, ReadByte, ReadBytes, ReadLine, ReadString, Reset

可选参数

参数名类型说明
raw...any可选的底层 io.Reader;不传则使用空缓冲

返回值

序号类型说明
r1*bufio.Reader带缓冲的 Reader 对象
r2error错误信息(传入类型非 io.Reader 时返回)

示例

reader = bufio.NewReader(bufio.NewBuffer("line1\nline2"))~
first = reader.ReadString('\n')~
println(first) // OUT: line1
assert first == "line1\n", "NewReader ReadString should read up to and including the delimiter"

NewWriter

NewWriter(raw ...any) (*bufio.Writer, error)

根据传入的 Writer 创建一个新的带缓冲 Writer(导出名为 bufio.NewWriter)

写入会先进入缓冲区,需调用 Flush 才会真正写到底层 Writer

常用方法:Write, WriteByte, WriteString, Reset, Flush

可选参数

参数名类型说明
raw...any可选的底层 io.Writer;不传则写入空缓冲

返回值

序号类型说明
r1*bufio.Writer带缓冲的 Writer 对象
r2error错误信息(传入类型非 io.Writer 时返回)

示例

sink = bufio.NewBuffer()
writer = bufio.NewWriter(sink)~
writer.WriteString("hello yak")
writer.Flush()
println(sink.String()) // OUT: hello yak
assert sink.String() == "hello yak", "NewWriter should flush buffered data to the sink"