Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go标准库之bufio.Scanner

Go标准库之bufio.Scanner

原创
作者头像
孟斯特
发布于 2024-08-29 10:18:00
发布于 2024-08-29 10:18:00
3470
举报
文章被收录于专栏: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
1360
Go读文件的几种姿势,你喜欢哪一种?
读取文件是程序员日常工作中最常见的任务之一。您可以根据需要以不同的方式进行操作。在本教程中,我们告诉你如何一次读取整个文件、一行行读取、一字一句读取文件、以及分块去读。所有这些方法在 Go ? 中都非
公众号: 云原生生态圈
2021/07/15
17.4K0
go 读取文件
对于循环的每一次迭代,内部文件指针被更新。当下一次读取发生时,从文件指针偏移开始的数据返回到缓冲区的大小。所有读取/读取调用在内部翻译成系统调用并发送到内核,内核管理这个指针。
solate
2019/07/22
2.4K0
Go 标准库:bufio
bufio 包是 Go 语言标准库中的一个包,提供了带缓冲的 I/O 操作,用于提高读写性能。主要的类型包括 Reader、Writer 和 Scanner。
孟斯特
2023/12/06
3700
Go 标准库:bufio
Golang 按行读取文件的三种方法
Golang 中有一个 bufio 包,它提供了 Scanner 类型,可以方便地按行读取文件。我们可以使用 Scanner 的 Scan() 方法来读取每一行。
恋喵大鲤鱼
2023/04/30
9.9K0
golang bufio 缓冲io
该缓冲区是 Reader Writer 接口集合对象 { *Reader, *Writer }
copy_left
2019/08/23
1.5K0
区块链开发之Go语言—IO操作
本篇文章是对区块链开发中的Go语言中常用的io操作的库做一个梳理 io,最基本的io Reader type Reader interface { Read(p []byte) (n int, err error) } 实现了Reader接口的都可以用read方法,将数据读入到p字节数组,n表示读取了几个字节,err返回错误。 如果读到了文件尾EOF,则err返回EOF。 注意,当文件最后一小段已经无法填满p这个字节数组时,不会产生EOF的错误,只会在下一次读取时产生n=0,err=io.EOF的错
linxinzhe
2018/04/10
1.1K0
Go-标准库-bufio(二)
bufio 包中的 Reader 和 Writer 对象都有一个缓冲区,缓冲区大小默认为 4096 字节。我们可以使用 bufio.NewReaderSize() 和 bufio.NewWriterSize() 函数来创建指定大小的缓冲区。下面是一个示例:
堕落飞鸟
2023/04/22
2750
Go基本库阅读:bufio库
这个库是io库的实现,如果需要自行实现io库可以看一下这个库中Read和Write相关函数的实现。
千灵域
2022/06/17
5870
超全总结:Go语言如何操作文件
本文所有代码已经上传github:https://github.com/asong2020/Golang_Dream/tree/master/code_demo/file_operate_demo
Golang梦工厂
2022/12/08
4150
超全总结:Go语言如何操作文件
100天精通Golang(基础入门篇)——第7天:深入学习键盘输入和打印输出,掌握常用函数和包
在编程过程中,键盘输入和打印输出是基础而重要的操作。本文将介绍如何使用Go语言的fmt包进行打印输出,以及如何从键盘获取输入。通过学习这些知识,你将能够更加灵活地处理用户输入和输出信息,提升程序的交互性和可读性。
猫头虎
2024/04/08
2450
100天精通Golang(基础入门篇)——第7天:深入学习键盘输入和打印输出,掌握常用函数和包
《Go小技巧&易错点100例》第二十七篇
在Go语言中,Scan函数是一个强大的工具,它主要用于从输入源(如标准输入、文件或网络连接)读取数据,并将其解析为指定的变量类型。
闫同学
2025/01/17
1580
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语言中,文件流是通过操作系统提供的文件句柄(file descriptor)来实现的。每个打开的文件都有一个唯一的文件句柄,通过该句柄可以对文件进行读取、写入和关闭等操作。
GeekLiHua
2025/01/21
1500
Go字符串拼接 ,那种性能最佳?
字符串是每一门编程语言必不可缺的数据类型,作为强大的Go语言也一样。在日常的开发工作中,对Go字符串的操作是必不可少的,但不同的操作方式,其性能也是不同的。本文将从五大操作方式来进行演示,到底哪一种操作方式最佳。
兔云小新LM
2023/02/28
3.2K0
Go字符串拼接 ,那种性能最佳?
Go 语言按行读取文件的方法
Go 中按行读取文件方法还是比较多的,但最简单也是最优雅的方式是使用 bufio.Scanner。示例如下:
Power
2025/04/02
1100
golang-101-hacks(25)——Buffered read
bufio.NewReader(f)生成一个 bufio.Reader结构体,其实现了缓冲读取的方法 (c)
羊羽shine
2019/07/01
4230
go 读写文件方式
Open() 底层调用的是 OpenFile(name, O_RDONLY, 0)
solate
2019/07/22
9340
golang bufio包怎么用?
上面实现了一个简单的文件读取功能,能正常工作,但是有一个有一个问题,每次从文件读取3个字节,而且读取了10次,也就是读取了3 * 10 = 30个字节的数据,却做了10次io操作,性能可想而知。
每周聚焦
2024/06/17
2510
golang bufio包怎么用?
如何使用 Go 语言来查找文本文件中的重复行?
在编程和数据处理过程中,我们经常需要查找文件中是否存在重复的行。Go 语言提供了简单而高效的方法来实现这一任务。在本篇文章中,我们将学习如何使用 Go 语言来查找文本文件中的重复行,并介绍一些优化技巧以提高查找速度。
网络技术联盟站
2023/07/03
8290
如何使用 Go 语言来查找文本文件中的重复行?
相关推荐
Go 使用 bufio 包逐行/逐段读取大文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档