Go bufio:带缓冲的I/O操作
学习使用bufio包进行高效的行读取、扫描和格式化输入输出。 · 难度:入门 · +15XP
bufio包的作用
bufio包为io.Reader和io.Writer提供缓冲功能,减少系统调用次数,提高I/O效率。核心类型:bufio.Reader(带缓冲的读取)、bufio.Writer(带缓冲的写入)、bufio.Scanner(便捷的行扫描器)。
| 类型 | 常用方法 | 适用场景 |
|---|---|---|
| bufio.Reader | ReadString(delim), ReadLine, Peek(n) | 按分隔符读取、预览数据 |
| bufio.Writer | WriteString(s), Flush() | 批量写入后刷新 |
| bufio.Scanner | Scan(), Text(), Bytes() | 按行或自定义分割读取 |
Scanner的灵活性
可以通过SplitFunc自定义分割逻辑,例如按单词、按字节等。内置分割函数:ScanLines(默认)、ScanWords、ScanRunes、ScanBytes。
代码示例:使用Scanner读取标准输入
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
// 从字符串读取
input := "line1
line2
line3"
scanner := bufio.NewScanner(strings.NewReader(input))
for scanner.Scan() {
fmt.Println("Line:", scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading error:", err)
}
// 使用bufio.Writer写入文件
var builder strings.Builder
writer := bufio.NewWriter(&builder)
writer.WriteString("Hello ")
writer.WriteString("Buffered ")
writer.WriteString("World!")
writer.Flush()
fmt.Println("Buffer content:", builder.String())
}
练习提示
编写一个程序,逐行读取文件内容并统计每行单词数。使用bufio.Scanner和SplitWords分割函数。