Golang 中的 bufio 包详解(五):常用函数

news/2024/10/18 2:29:16/

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 mainimport ("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 包提供的类型和方法,可以高效地读写数据,特别是当涉及到大量数据的读写时,可以大大提高程序的性能。


http://www.ppmy.cn/news/572517.html

相关文章

希腊字母英文对照表

希腊字母对应英文αAlphaβBetaγGammaδDeltaεEpsilonζZetaνNuξXiοOmicronπPiρRhoσSigmaηEtaθThetaιIotaκKappaλLambadaμMuτTauυUpsilonφPhiχChiψPsiωOmega

古希腊神话故事:雅典娜的神像

雅典娜的神像当伊拉斯最初建造特洛伊城时,他祈求 宙斯赐福于这座城市。宙斯听到祈求后,一尊木制的智慧雅典娜像从天堂落到了 城墙里。人们将它称作雅典娜神像。这尊木像担任着保卫和看守城市的任务。在 祭神的宗教仪式中,它在欢快的气氛和赞美…

鼎捷雅典娜诞生的背后:在不确定性中寻找到确定性

毫无疑问,过去几年随着数字化转型逐渐深入千行百业,越来越多的行业也正从“浅层次”数字化走向“深层次”数字化,因此未来如何进一步深化数智化转型,实现企业业务和商业模式的创新不仅是“大势所趋”,更是未来企业增长…

雅典娜暴利烹饪系列(下)

"呀--呀--呀--"爬到冰箱上的纱织吓的花容失色,"快点把那些土鳖拿开啦----" 端着一盆螃蟹的迪马斯头上好几个"加号":"你叫个什么劲呀!!!不是你要学煮螃蟹,叫我下河给你捞…

雅典娜暴利烹饪系列(上)

刨冰事件 田中大人曾经问过:和平是无聊的的代名词吗?答:不是。 今天的圣域在纱织的领导下,依然过着比战时更加热闹的日子。  早晨出门时,修罗觉得自己是这个世界上最为幸福的人。为了庆祝他拿到特级厨师证书&#xf…

深度解读鼎捷雅典娜三重创新价值

“对中国企业而言,在数智化新时代,重新审视在不确定性环境下的应变能力,加速推动数字化转型和智慧企业的落地建设,已经不再是一道选择题,而是必须给出的答案。”专业科技类媒体“申耀的科技观察”如是说。时势造英雄。…

2335:拯救雅典娜

2335:拯救雅典娜 时间限制:1 秒 内存限制:32 兆 题目描述 悲剧的雅典娜又被坏蛋抓走了!于是乎,正在马尔代夫度假的青铜五小强又要加班了-_-! 这次雅典娜被抓到了一个迷宫中,这个迷宫是方形的,且只有一层&am…

机器学习之PCA算法

目录 PCA算法 PCA目标 PCA原理推导 基于最大可分性推导 基于最近重构误差推导 PCA算法流程 PCA优点 PCA缺点 基于PCA的人脸识别 PCA算法 PCA,即主成分分析(Principal Component Analysis),是一种常用的降维技术&#x…