Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go标准库之bufio.Scanner

Go标准库之bufio.Scanner

原创
作者头像
孟斯特
发布于 2024-08-29 10:18:00
发布于 2024-08-29 10:18:00
4300
举报
文章被收录于专栏:Go学习Go学习

bufio.Scanner 是 Go 标准库中的一个类型,用于高效地逐行读取输入,通常用于处理来自文件、标准输入或其他 I/O 源的流式数据。它的主要功能是将输入按行或自定义分隔符进行分割,便于逐行或逐段处理数据。下面是关于 bufio.Scanner 的简单介绍。

1. 基本用法

创建 Scanner

要使用 bufio.Scanner,首先需要创建一个 Scanner 实例。通常,使用 bufio.NewScanner 函数将一个实现了 io.Reader 接口的对象作为参数传递给 NewScanner

代码语言:go
AI代码解释
复制
file, err := os.Open("filename.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

scanner := bufio.NewScanner(file)

上面的代码中,file 是一个实现了 io.Reader 接口的 *os.File 对象。

逐行扫描

创建 Scanner 实例后,可以使用 ScannerScan 方法逐行读取输入。每调用一次 Scan,Scanner 会读取下一行的数据。

代码语言:go
AI代码解释
复制
for scanner.Scan() {
    line := scanner.Text()  // 获取当前行的文本
    fmt.Println(line)
}

Scan 方法会返回 false,当到达输入的末尾或遇到错误时,结束循环。

错误处理

在扫描过程中,可以使用 Err 方法来检查是否发生了错误。

代码语言:go
AI代码解释
复制
if err := scanner.Err(); err != nil {
    log.Fatal(err)
}

2. 自定义分隔符

默认情况下,Scanner 使用换行符 (\n) 作为分隔符,将输入按行分割。但你可以通过 Split 方法自定义分隔符。

Go 提供了一些内置的分隔函数,例如:

  • bufio.ScanLines:按行分割,这是默认的行为。
  • bufio.ScanWords:按单词分割。
  • bufio.ScanRunes:按 Unicode 字符分割。
  • bufio.ScanBytes:按字节分割。

你也可以实现自己的分隔函数,分隔函数的签名如下:

代码语言:go
AI代码解释
复制
func(data []byte, atEOF bool) (advance int, token []byte, err error)

例如,如果你想按空格分割输入,可以使用:

代码语言:go
AI代码解释
复制
scanner.Split(bufio.ScanWords)

3. 缓冲区大小

默认情况下,Scanner 使用的缓冲区大小为 64 KB。如果需要处理更大的单行输入,可以使用 Buffer 方法来调整缓冲区大小。

代码语言:go
AI代码解释
复制
buf := make([]byte, 0, 1024*1024) // 1 MB
scanner.Buffer(buf, 1024*1024)

Buffer 方法的第一个参数是用作缓冲区的字节切片,第二个参数是缓冲区的最大大小。

4. 完整示例

下面是一个完整的示例,展示了如何使用 Scanner 逐行读取文件并处理每一行:

代码语言:go
AI代码解释
复制
package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    file, err := os.Open("filename.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    
    // 使用自定义分隔符,例如按空格分割
    // scanner.Split(bufio.ScanWords)

    for scanner.Scan() {
        line := scanner.Text()
        fmt.Println(line)
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

5. 注意事项

  • Scanner 的缓冲区大小是有限的,如果行的长度超过缓冲区大小,默认情况下 Scanner 会返回错误。对于超大输入,请考虑使用 bufio.Reader 结合 ReadLine 或者其他方式读取。
  • Scanner 不适合处理需要一次性加载到内存中的非常大的输入数据,因为它只能按行或分隔符处理。

6. 小结

bufio.Scanner 提供了一种简单高效的方式来逐行读取数据,非常适合用于读取和处理文本文件或从标准输入读取命令行输入。在需要按行或按自定义分隔符读取输入时,bufio.Scanner 是一个非常有用的工具。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go 使用 bufio 包逐行/逐段读取大文件
按行读取文件相较于一次性载入,有着很多优势,如内存效率高、处理速度快、实时性高、可扩展性强和灵活度高等,特别是当遇到处理大文件时,这些优势会更加明显。
Power
2025/04/02
2180
Golang 按行读取文件的三种方法
Golang 中有一个 bufio 包,它提供了 Scanner 类型,可以方便地按行读取文件。我们可以使用 Scanner 的 Scan() 方法来读取每一行。
恋喵大鲤鱼
2023/04/30
10.2K0
Go读文件的几种姿势,你喜欢哪一种?
读取文件是程序员日常工作中最常见的任务之一。您可以根据需要以不同的方式进行操作。在本教程中,我们告诉你如何一次读取整个文件、一行行读取、一字一句读取文件、以及分块去读。所有这些方法在 Go ? 中都非
公众号: 云原生生态圈
2021/07/15
17.6K0
golang bufio 缓冲io
该缓冲区是 Reader Writer 接口集合对象 { *Reader, *Writer }
copy_left
2019/08/23
1.6K0
go语言第七章(文件流)
在Go语言中,文件流是通过操作系统提供的文件句柄(file descriptor)来实现的。每个打开的文件都有一个唯一的文件句柄,通过该句柄可以对文件进行读取、写入和关闭等操作。
GeekLiHua
2025/01/21
1950
Golang标准库学习——buffio包 ---转
import "bufio" bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象。 一、常量 const ( // 用于缓冲一个token,实际需要的最大token尺寸可能小一些,例如缓冲中需要保存一整行内容 MaxScanTokenSize = 64 * 1024 ) 二、变量 var ( ErrInvalidUnreadByte = errors.New("bufi
李海彬
2018/03/20
1.6K0
如何用 Go 实现高效的文件处理
文件处理是开发中常见的任务,比如解析日志、处理配置文件或批量转换数据。Go 语言以其简洁的语法、高效的并发模型和强大的标准库,成为文件处理的理想选择。本文分享三个 Go 文件处理技巧,涵盖大文件读取、并发处理和错误管理,帮助你编写更高效的代码。
是山河呀
2025/07/15
690
Go 标准库:bufio
bufio 包是 Go 语言标准库中的一个包,提供了带缓冲的 I/O 操作,用于提高读写性能。主要的类型包括 Reader、Writer 和 Scanner。
孟斯特
2023/12/06
4210
Go 标准库:bufio
4 秒处理 10 亿行数据! Go 语言的 9 大代码方案,一个比一个快
2024 年开年,Java “十亿行挑战”(1BRC)火爆外网。该挑战赛要求开发者编写一个 Java 程序,从一个包含十亿行信息的文本文件中检索温度测量值,并计算每个气象站的最小、平均值和最高温度。“十亿行挑战”的目标是为这项任务创建最快的实现,同时探索现代 Java 的优势。
深度学习与Python
2024/03/07
7620
4 秒处理 10 亿行数据! Go 语言的 9 大代码方案,一个比一个快
Go语言中常见100问题-#46 Using a filename as a function input
在我们需要实现一个函数功能是读取一个文件的时候,将文件名传递给函数不是一种最佳的实践,可能产生一些反作用,比如在单元测试起来困难。下面将深入讨论这个问题并掌握怎么处理它。
数据小冰
2022/08/15
2560
Go-标准库-bufio(二)
bufio 包中的 Reader 和 Writer 对象都有一个缓冲区,缓冲区大小默认为 4096 字节。我们可以使用 bufio.NewReaderSize() 和 bufio.NewWriterSize() 函数来创建指定大小的缓冲区。下面是一个示例:
堕落飞鸟
2023/04/22
2930
golang-101-hacks(25)——Buffered read
bufio.NewReader(f)生成一个 bufio.Reader结构体,其实现了缓冲读取的方法 (c)
羊羽shine
2019/07/01
4400
超全总结:Go语言如何操作文件
本文所有代码已经上传github:https://github.com/asong2020/Golang_Dream/tree/master/code_demo/file_operate_demo
Golang梦工厂
2022/12/08
4430
超全总结:Go语言如何操作文件
Go基本库阅读:bufio库
这个库是io库的实现,如果需要自行实现io库可以看一下这个库中Read和Write相关函数的实现。
千灵域
2022/06/17
6070
Go by Example 中文版: 行过滤器
行过滤器(line filter) 是一种常见的程序类型, 它读取 stdin 上的输入,对其进行处理,然后将处理结果打印到 stdout。 grep 和 sed 就是常见的行过滤器。
ccf19881030
2020/09/25
5800
Go by Example 中文版: 行过滤器
Go解析环境变量
在实际开发中,我们常常需要根据不同环境(开发、测试、生产)来配置数据库地址、端口号、API 密钥等信息。环境变量(Environment Variables)是最常见、最安全的一种配置方式。
孟斯特
2025/05/15
1770
Go解析环境变量
go 读写文件方式
Open() 底层调用的是 OpenFile(name, O_RDONLY, 0)
solate
2019/07/22
9710
100天精通Golang(基础入门篇)——第7天:深入学习键盘输入和打印输出,掌握常用函数和包
在编程过程中,键盘输入和打印输出是基础而重要的操作。本文将介绍如何使用Go语言的fmt包进行打印输出,以及如何从键盘获取输入。通过学习这些知识,你将能够更加灵活地处理用户输入和输出信息,提升程序的交互性和可读性。
猫头虎
2024/04/08
2790
100天精通Golang(基础入门篇)——第7天:深入学习键盘输入和打印输出,掌握常用函数和包
《Go小技巧&易错点100例》第二十七篇
在Go语言中,Scan函数是一个强大的工具,它主要用于从输入源(如标准输入、文件或网络连接)读取数据,并将其解析为指定的变量类型。
闫同学
2025/01/17
2330
Go程序例子(66):行过滤器
行过滤器是一种常见的程序类型,它从标准输入(stdin)读取数据,进行处理,然后将一些派生结果打印到标准输出(stdout)。grep 和 sed 是常见的行过滤器。
用户11078756
2025/01/20
1040
Go程序例子(66):行过滤器
相关推荐
Go 使用 bufio 包逐行/逐段读取大文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档