bufio.Scanner

bufio包使处理输入和输出方便又高效。Scanner类型是该包最有用的特性之一,它读取输入并将其拆成行或单词;通常是处理行形式的输入最简单的方法。该变量从程序的标准输入中读取内容。每次调用input.Scanner,即读入下一行,并移除行末的换行符;读取的内容可以调用input.Text()得到。Scan函数在读到一行时返回true,在无输入时返回false

使用DEMO:

  1. func main(){
  2. scanner:=bufio.NewScanner(
  3. strings.NewReader("ABCDEFG\nHIJKELM"),
  4. )
  5. for scanner.Scan(){
  6. fmt.Println(scanner.Text()) // scanner.Bytes()
  7. }
  8. }

理解:对于Scanner.Scan方法,相当于其他语言的迭代器iterator,并把迭代器指向的数据存放到新的缓冲区里。新的缓冲区(token)可以通过scanner.Text()或者scanner.Bytes()获取到。

Scanner.Scan方法默认是以换行符\n,作为分隔符。如果你想指定分隔符,Go语言提供了四种方法,ScanBytes(返回单个字节作为一个 token), ScanLines(返回一行文本), ScanRunes(返回单个 UTF-8 编码的 rune 作为一个 token)和ScanWords(返回通过“空格”分词的单词)。 使用方式:

  1. func main(){
  2. scanner:=bufio.NewScanner(
  3. strings.NewReader("ABCDEFG\nHIJKELM"),
  4. )
  5. scanner.Split(ScanWords/*四种方式之一,你也可以自定义, 实现SplitFunc方法*/)
  6. for scanner.Scan(){
  7. fmt.Println(scanner.Text()) // scanner.Bytes()
  8. }
  9. }

结论:我们一般在读取数据到缓冲区时,且想要采用分隔符分隔数据流时,我们一般使用bufio.Scanner数据结构,而不使用bufio.Reader

NewScanner 和 NewReader 读取文件内容

newScanner读取文件

  1. func printFile(filename string) {
  2. file, err := os.Open(filename)
  3. if err != nil {
  4. panic(err)
  5. }
  6. defer file.Close()
  7. scanner := bufio.NewScanner(file)
  8. for scanner.Scan() {
  9. fmt.Println("scanner", scanner.Text())
  10. }
  11. }

newReader读取文件

  1. func printFile (filename string) {
  2. file, err := os.Open(filename)
  3. defer file.Close()
  4. if err != nil {
  5. panic(err)
  6. }
  7. reader := bufio.NewReader(file)
  8. for {
  9. line, _, err := reader.ReadLine()
  10. if err != nil || err == io.EOF {
  11. break
  12. } else {
  13. fmt.Printf("the line content is : %s\n", line)
  14. }
  15. }
  16. }

Go bufio库的更多相关文章

  1. golang bufio、ioutil读文件的速度比较(性能测试)和影响因素分析

    前言 golang读取文件的方式主要有4种: 使用File自带的Read方法 使用bufio库的Read方法 使用io/ioutil库的ReadAll() 使用io/ioutil库的ReadFile( ...

  2. golang bufio解析

    golang bufio 当进行频繁地对少量数据读写时会占用IO,造成性能问题.golang的bufio库使用缓存来一次性进行大块数据的读写,以此降低IO系统调用,提升性能. 在Transport中可 ...

  3. GoLang几种读文件方式的比较

    GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main ...

  4. go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  5. Golang 实现简单的滚动读取文本更新

    这个小程序要实现的效果,简单地说,就是将目标文件的内容读取输出到终端,并且目标文件并不是静态的,而是随时会添加新的内容.我们的目标就是一旦目标文件添加了新的内容,就把它读取出来并且显示到终端上. 实现 ...

  6. 豌豆夹Redis解决方式Codis源代码剖析:Proxy代理

    豌豆夹Redis解决方式Codis源代码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描写叙述: Codis is a proxy b ...

  7. 豌豆夹Redis解决方案Codis源码剖析:Proxy代理

    豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...

  8. go标准库的学习-bufio

    参考https://studygolang.com/pkgdoc 导入方式: import "bufio" bufio包实现了有缓冲的I/O.它包装一个io.Reader或io.W ...

  9. Go基础篇【第4篇】: 内置库模块 bufio

    bufio包实现了有缓冲的I/O.它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象. 即:为了解决CPU与磁盘IO ...

随机推荐

  1. printf,sprintf,vsprintf

    printf,sprintf比较常用,vsprintf不常用. 1. 三个函数的声明: int printf (const char * szFormat, ...); int sprintf (ch ...

  2. 代码备份:按模式划分椭圆轨迹渐变matlab

    x=sqrt(a^*(-y^/b^)); r=ceil(+*y); x=ceil(x); I(m/,m/+x)=+*y; elseif r== I(m/::m/+,m/+x::m/++x)=+*y; ...

  3. day13迭代器与生成器

    三个作业: # 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码 login_dic = {'alex':False} def ...

  4. day8笔记

    一.上节回顾 1,id() 内存地址2, == 比较的是值 is 比较的是内存地址 数字,字符串,有小数据池, #内存地址一样的 int -5--256 str:1,不能有空格. 2,长度不能超过20 ...

  5. SQL Server 2008中如何为XML字段建立索引

    from:http://blog.csdn.net/tjvictor/article/details/4370771 SQL Server中的XML索引分为两类:主XML 索引和辅助XML索引.其中辅 ...

  6. [Spring Data Repositories]学习笔记--为repository添加通用的方法

    如果想把一个方法加到所有的repository中,用前一篇提到的方法就不合适了. 英文原版,请看 http://docs.spring.io/spring-data/data-mongo/docs/1 ...

  7. 二、docker入门

    docker入门 使用场景: 面向产品.面向开发.面向测试.面向运维.面向自动化.面向微服务.面向大规模的分布式架构(微信红包) 虚拟化解决方案: 商业解决方案: VMware vSphere,VMw ...

  8. 普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务

    在之前的一篇博客<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们介绍了很多应用场景里面,RTSP和RTMP直播协议都无法满足应用需求时,国标 ...

  9. mysql 日期加减天数

    MySQL 为日期增加一个时间间隔:date_add() now()       //now函数为获取当前时间 select date_add(now(), interval 1 day); - 加1 ...

  10. 巨蟒python全栈开发django4:url反向解析图解&&模板渲染2

    注意:前端有aaa变量,后端没有aaa变量,存在p标签,但是显示不出来 有p标签,我们可以指定默认值,在没有其他内容的时候 过滤器有60多种,有点多,用到的时候再记和查 结果: 显示是acd 看长度 ...