RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
go语言读写文件操作 go语言读写excel

golang中bufio包

一、介绍go标准库中的bufio

专注于为中小企业提供成都网站设计、网站制作、外贸营销网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业右玉免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

最近用golang写了一个处理文件的脚本,由于其中涉及到了文件读写,开始使用golang中的 io 包,后来发现golang 中提供了一个bufio的包,使用这个包可以大幅提高文件读写的效率,于是在网上搜索同样的文件读写为什么bufio 要比io 的读写更快速呢?根据网上的资料和阅读源码,以下来详细解释下bufio的高效如何实现的。

bufio 包介绍

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

以上为官方包的介绍,在其中我们能了解到的信息如下:

bufio 是通过缓冲来提高效率

简单的说就是,把文件读取进缓冲(内存)之后再读取的时候就可以避免文件系统的io 从而提高速度。同理,在进行写操作时,先把文件写入缓冲(内存),然后由缓冲写入文件系统。看完以上解释有人可能会表示困惑了,直接把 内容-文件 和 内容-缓冲-文件相比, 缓冲区好像没有起到作用嘛。其实缓冲区的设计是为了存储多次的写入,最后一口气把缓冲区内容写入文件。下面会详细解释

bufio 封装了io.Reader或io.Writer接口对象,并创建另一个也实现了该接口的对象

io.Reader或io.Writer 接口实现read() 和 write() 方法,对于实现这个接口的对象都是可以使用这两个方法的

注明:介绍内容来自博主 LiangWenT

,原文链接: ,在查找资料时,发现这篇博客的内容很好理解

bufio包实现了缓存IO。它包装了io.Reader和io.Write对象,创建了另外的Reader和Writer对象,它们也实现了io.Reader和io.Write接口,具有缓存。注意:缓存是放在主存中,既然是保存在主存里,断电会丢失数据,那么要及时保存数据。

二、常用内容

1、Reader类型

NewReaderSize

作用:NewReaderSize将rd封装成一个带缓存的bufio.Reader对象。缓存大小由size指定(如果小于16则会被设为16)。如果rd的基类型就是有足够缓存的bufio.Reader类型,则直接将rd转换为基类型返回。

NewReader

funcReader相当于NewReaderSize(rd, 4096)

Peek

Peek返回缓存的一个切片,该切片引用缓存中前n个字节的数据,该操作不会将数据读出,只是引用,引用的数据在下一次读取操作之前有效的。如果切片长度小于n,则返回一个错误信息说明原因。如果n大于缓存的总大小,则返回ErrBufferFull。

Read

Read从b中数据到p中,返回读出的字节数和遇到的错误。如果缓存不为空,则只能读出缓冲中的数据,不会从底层io.Reader中提取数据,如果缓存为空,则:

1、len(p) = 缓存大小,则跳过缓存,直接从底层io.Reader中读出到p中

2、len(p) 缓存大小,则先将数据从底层io.Reader中读取到缓存中,再从缓存读取到p中。

Buffered

Buffered返回缓存中未读取的数据的长度。

Discard

Discard跳过后续的n个字节的数据,返回跳过的字节数。

Writer类型和方法

write结构

NewWriteSize

NewWriterSize将wr封装成一个带缓存的bufio.Writer对象,缓存大小由size指定(如果小于4096则会被设置未4096)。

NewWrite

NewWriter相等于NewWriterSize(wr, 4096)

WriteString

WriteString功能同Write,只不过写入的是字符串

WriteRune

WriteRune向b写入r的UTF-8编码,返回r的编码长度。

Flush

Available

Available 返回缓存中未使用的空间的长度

Buffered

Buffered返回缓存中未提交的数据长度

Reset

Reset将b的底层Write重新指定为w,同时丢弃缓存中的所有数据,复位所有标记和错误信息。相当于创建了一个新的bufio.Writer。

GO中还提供了Scanner类型,处理一些比较简单的场景。如处理按行读取输入序列或空格分隔的词等。

内容来自:

参考链接:

1)

2)

GoLang -- json文件操作

json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好。官方提供的Json解析包已经非常强大,我们接下来讲解Json的序列化与反序列化操作。另外还有一些第三方的Json解析库,也能够高效的操作Json对象,比如simplejson,ffjson等。下面是两个比较重要的函数:

• Json Marshal:将数据编码成json字符串

Marshal 用于将struct对象序列化到json对象中。v是interface{}类型,任何类型都实现了空接口。

1:tag中的第一个参数是用来指定别名,比如Name 指定别名为 username `json:"username"`

2:如果不想指定别名但是想指定其他参数用逗号来分隔,omitempty 指定到一个field时,如果在赋值时对该属性未赋值或者对该属性赋值为 zero value,那么将Person序列化成json时会忽略该字段

3:- 指定到一个field时,无论有没有值,将Person序列化成json时都会忽略该字段

4:string 指定到一个field时,比如Person中的Count为int类型 如果没有任何指定在序列化到json之后也是int 比如这个样子 “Count”:0,但是如果指定了string之后序列化之后也是string类型的,那么就是这个样子"Count":"0"

• struct序列化为Json

• slice序列化为Json

• map 序列化为Json

• Json Unmarshal:将json字符串解码到相应的数据结构,Unmarshal的第一个参数是[]byte,第二个参数是接受json解析的数据结构。

下面我们依次讲解Json的操作。

1:将Json序列化进入结构体

2::将Json序列化到结构体slice

3:将Json序列化进Map

4:将Json序列化进Slice

Go语言的特点

类型 在变量名后边

也可不显式声明类型, 类型推断, 但是是静态语言, name一开始放字符串就不能再赋值数字

方法,属性 分开 方法名首字母大写就是就是外部可调的

面向对象设计的一个重要原则:“优先使用组合而不是继承”

Dog 也是Animal , 要复用Animal 的属性和方法,

只需要在结构体 type 里面写 Animal

入口也是main, 用用试试

多态, 有这个方法就是这个接口的实现, 具体的类 不需要知道自己实现了什么接口,

使用: 在一个函数调用之前加上关键字go 就启动了一个goroutine

创建一个goroutine,它会被加入到一个全局的运行队列当中,

调度器 会把他们分配给某个 逻辑处理器 的队列,

一个逻辑处理器 绑定到一个 操作系统线程 ,在上面运行goroutine,

如果goroutine需要读写文件, 阻塞 ,就脱离逻辑处理器 直接 goroutine - 系统线程 绑定

编译成同名.exe 来执行, 不通过虚拟机, 直接是机器码, 和C 一样, 所以非常快

但是也有自动垃圾回收,每个exe文件当中已经包含了一个类似于虚拟机的runtime,进行goroutine的调度

默认是静态链接的,那个exe会把运行时所需要的所有东西都加进去,这样就可以把exe复制到任何地方去运行了, 因此 生成的 .exe 文件非常大


分享文章:go语言读写文件操作 go语言读写excel
文章出自:http://scyingshan.cn/article/ddgohcs.html