脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Golang 中的 Bufio 包详解之常用函数

Golang 中的 Bufio 包详解之常用函数

2023-10-20 10:40路多辛 Golang

Golang 中的 bufio 包是带缓冲 I/O 操作的标准库,之前的几篇文章详细讲解了 bufio.Reader、bufio.Writer 和 bufio.Scanner 这个几个结构体的使用方法、特性和使用场景,本文介绍一下 bufio 包中的函数。

Golang 中的 Bufio 包详解之常用函数

Golang 中的 bufio 包是带缓冲 I/O 操作的标准库,之前的几篇文章详细讲解了 bufio.Reader、bufio.Writer 和 bufio.Scanner 这个几个结构体的使用方法、特性和使用场景,本文介绍一下 bufio 包中的函数。

介绍常用函数之前,先简单介绍下另一个结构体类型和一个函数类型:bufio.ReadWriter 和 bufio.SplitFunc,对应的定义如下:

type ReadWriter struct {
	*Reader
	*Writer
}

type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)

ReadWriter 结构体实现了 io.ReadWriter 接口,SplitFunc 是用来指定自定义分割规则的函数类型,通常结合 bufio.Scanner 使用。

创建对象函数

  • func NewReader(rd io.Reader) *Reader,创建一个带缓冲的 Reader 对象。
  • func NewWriter(w io.Writer) *Writer,创建一个带缓冲的 Writer 对象。
  • func NewReadWriter(r *Reader, w *Writer) *ReadWriter,创建一个带缓冲的 ReadWriter 对象。
  • func NewReaderSize(rd io.Reader, size int) *Reader,创建一个带缓冲的 Reader 对象,使用 size 指定缓冲区的最小值。
  • func NewWriterSize(w io.Writer, size int) *Writer,创建一个带缓冲的 Writer 对象,使用 size 指定缓冲区的最小值。
  • func NewScanner(r io.Reader) *Scanner,创建一个带缓冲的 Scanner 对象。

SplitFunc 类型函数

以下几个函数都是 SplitFunc 类型,通常与 bufio.NewScanner 一起使用。

  • func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error),用于逐行读取输入流中的数据。
  • func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error),用于逐个字节读取输入流中的数据。
  • func ScanRunes(data []byte, atEOF bool) (advance int, token []byte, err error),用于逐个 unicode 编码读取输入流中的数据。
  • func ScanWords(data []byte, atEOF bool) (advance int, token []byte, err error),用于逐个单词(空格分割)读取输入流中的数据。

使用示例

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	// 确定读取文件的路径
	path := "file.txt"

	// 打开文件并处理错误
	file, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// 创建Scanner类型对象
	scanner := bufio.NewScanner(file)

	// 设置分割函数
	scanner.Split(bufio.ScanWords)

	// 创建一个map对象,用于存储单词出现的次数
	counts := make(map[string]int)

	// 读取文件内容并统计单词出现次数
	for scanner.Scan() {
		word := strings.ToLower(scanner.Text())
		counts[word]++
	}

	// 检查Scanner是否出错
	if err := scanner.Err(); err != nil {
		panic(err)
	}

	// 输出结果到控制台
	for word, count := range counts {
		fmt.Printf("%s: %d\n", word, count)
	}

	// 让用户根据输入的关键字进行筛选
	fmt.Print("Enter keyword to filter results: ")
	reader := bufio.NewReader(os.Stdin)
	input, _ := reader.ReadString('\n')
	keyword := strings.TrimSpace(input)

	if keyword != "" {
		for word, count := range counts {
			if strings.Contains(word, keyword) {
				fmt.Printf("%s: %d\n", word, count)
			}
		}
	}
}

首先创建了一个 Scanner 类型的对象,指定了 ScanWords 作为分隔函数,然后遍历文件内容,统计单词出现的次数并将结果存储到一个map中,最后让用户输入关键字进行筛选,根据关键字过滤并输出结果。

小结

bufio 是一个提供了带缓冲读写操作的包,通过使用 bufio 包提供的类型和方法,可以高效地读写数据,特别是当涉及到大量数据的读写时,可以大大提高程序的性能。

原文地址:https://www.toutiao.com/article/7248597389269811769/

延伸 · 阅读

精彩推荐
  • Golangbeego获取ajax数据的实例

    beego获取ajax数据的实例

    下面小编就为大家分享一篇beego获取ajax数据的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    Super_Ssssss9192020-05-13
  • GolangGolang 语言极简类型转换库 Cast

    Golang 语言极简类型转换库 Cast

    本文我们介绍类型转换三方库 - github.com/spf13/cast,它是一个极简类型转换的三方库,通过它提供的函数,可以方便我们进行类型转换,极大提升我们的开发...

    Golang语言开发栈7032021-11-15
  • Golanggrpcurl通过命令行访问gRPC服务

    grpcurl通过命令行访问gRPC服务

    这篇文章主要为大家介绍了grpcurl通过命令行访问gRPC服务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    yongxinz7962022-10-20
  • Golanggolang搭建静态web服务器的实现方法

    golang搭建静态web服务器的实现方法

    这篇文章主要介绍了golang搭建静态web服务器的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    晴_空6172020-05-18
  • Golang破解IDEA(Goland)注册码设置 license server一直有效不过期的过程详解

    破解IDEA(Goland)注册码设置 license server一直有效不过期的过程详

    这篇文章主要介绍了破解IDEA(Goland)注册码设置 license server一直有效不过期,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一...

    dodod201232412021-02-01
  • Golang详解Go 中的时间处理

    详解Go 中的时间处理

    这篇文章主要介绍了Go 中的时间处理,本文将介绍 time 库中一些重要的函数和方法,希望能帮助到那些一遇到 Go 时间处理问题就需要百度的童鞋,需要的朋...

    机器铃砍菜刀9842022-07-19
  • GolangGO语言映射(Map)用法分析

    GO语言映射(Map)用法分析

    这篇文章主要介绍了GO语言映射(Map)用法,以实例形式较为详细的分析了针对映射的创建、填充、遍历及修改等操作的技巧,需要的朋友可以参考下 ...

    shichen20142812020-04-12
  • Golang利用Go语言追加内容到文件末尾

    利用Go语言追加内容到文件末尾

    关于Go语言读写文件,网上很多教程了,但是今天有个需求,想要把内容追加写到文件末尾,在网上找了很久才找到答案,现在分享给大家,有需要的可以...

    steveye2502020-05-01