Golang 中的 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.toymoban.com/news/detail-500425.html

到了这里,关于Golang 中的 bufio 包详解(五):常用函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang strings 常用函数

    官网 https://pkg.go.dev/strings 这里介绍最常用的函数 1、Fields 以空格为字段分割符,返回[]string 2、Contains 是否包含子串,返回bool 3、Split ,以子串分割,返回[]string 4、ReplaceAll 替换 5、其他 -------------end

    2024年02月13日
    浏览(37)
  • Golang 中的 map 详解

    1、map 的定义   在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 key, value 对组成的抽象数据结构,并且同一个 key 只会出现一次。   两个关键点:map 是由 key-value 对组成的;key 只会出现一次。   map 的设计也被称为 “The dictionary problem(字典问题)

    2024年02月14日
    浏览(52)
  • Golang 中的接口详解

    什么是接口:接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 在Go语言中接口(interface)是一种类型,一种抽象的类型。 interface是一组method的集合,是duck-type programming的一种体现。 接口做的事情就像是定义一个协议(规则

    2024年02月13日
    浏览(39)
  • Golang 中的信号(Signal)机制详解

    目录 信号基础概念 Golang 对信号的处理 信号处理的使用场景和使用示例 信号的局限性 Go 中的特殊信号处理 小结 Signal 是一种操作系统级别的事件通知机制,进程可以响应特定的系统信号。这些信号用于指示进程执行特定的操作,如程序终止、挂起、恢复等。Golang 的标准库

    2024年01月16日
    浏览(41)
  • Golang 中的 io 包详解(二):组合接口

    Golang 中,接口可以通过嵌入多个其他接口组成组合接口。组合接口表示的是子接口的集合,具有所有子接口的方法,可以通过组合多个不同的接口组成一个更强大的抽象。本文主要介绍下 io 包中的组合接口。 是对Reader和Writer接口的组合,聚合了基本的读写操作。简单示例如

    2024年02月08日
    浏览(42)
  • Golang 中的 io 包详解(五):结构体类型介绍

    实现了 io.Reader 接口,并且进行了功能扩展。R 表示 io.Reader 对象,N 表示最多允许读取的字节数。简单示例如下所示: 当读取的字节数超过限制时,LimitedReader 会自动终止读取并返回一个 io.EOF 错误,表示已经达到了总字节数的限制。 实现了 io.Reader、io.ReaderAt 和 io.Seeker 接口

    2024年02月08日
    浏览(46)
  • Golang 中的 time 包详解(一):time.Time

    在日常开发过程中,会频繁遇到对时间进行操作的场景,使用 Golang 中的 time 包可以很方便地实现对时间的相关操作。接下来的几篇文章会详细讲解 time 包,本文先讲解一下 time 包中的结构体 time.Time。 time.Time 类型用来表示一个具体的时间点,可以精确到纳秒。结构体定义和

    2024年02月15日
    浏览(43)
  • Golang 中的 bytes 包详解(二):bytes.Reader

    Golang 中的 bytes 包是其中一个 IO 操作标准库,实现了对字节切片([]byte)的操作,提供了类似于 strings 包的功能。本文先讲解一下 bytes 包中的结构体 bytes.Reader。 bytes.Reader 实现了 io.Reader、io.ReaderAt、io.WriterTo、io.Seeker、io.ByteScanner 和 io.RuneScanner接口,提供了从字节切片中读取

    2024年02月12日
    浏览(34)
  • Golang 中的 time 包详解(二):time.Duration

    在日常开发过程中,会频繁遇到对时间进行操作的场景,使用 Golang 中的 time 包可以很方便地实现对时间的相关操作。接下来的几篇文章会详细讲解 time 包,本文讲解一下 time 包中的 time.Duration 类型。 time.Duration 类型是一个有符号的 int64 类型,以纳秒为单位,用来表示两个时

    2024年02月15日
    浏览(43)
  • Golang 中的 strings 包详解(一):strings.Builder

    strings.Builder 是 Golang  中的一个用于高效构建字符串的类型,使用了一个循环缓冲区来存储字符数据,避免了频繁的内存分配和拷贝操作,尤其适用于频繁拼接字符串的场景。结构体定义和对应的方法如下: 其中比较常用的方法有: Reset() :重置 Builder 中的字符串内容,使得

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包