go语言bufio go语言教程

golang 在文本文档中查找到指定内容要怎么才能读取整行package main
import (
"fmt"
"io/ioutil"
"log"
"strings"
)
func main() {
content, err := ioutil.ReadFile("/usr/share/applications/gvim.desktop")
if err != nil {
log.Fatal(err)
}
lines := strings.Split(string(content), "\n")
for _, v := range lines {
trimline := strings.TrimSpace(v)
if strings.Contains(trimline, "text/plain") {
fmt.Println(trimline)
}
}
}
Golang中读取文件最常见的错误使用文件名作为输入
另一个常见错误是将文件名传递给函数 。
假设我们必须实现一个函数来计算文件中的空行数 。最自然的实现是这样的:
filename作为输入给出go语言bufio , 所以我们打开它然后我们实现我们的逻辑go语言bufio,对吧?
现在go语言bufio,假设我们希望在此函数之上实现 单元测试  , 以使用普通文件,空文件 , 具有不同编码类型的文件等进行测试 。很容易变得非常难以管理 。
此外,如果我们想要实现相同的逻辑但是对于HTTP主体,例如,我们将不得不为此创建另一个函数 。
Go有两个很棒的抽象: io.Reader 和 io.Writer。相反,通过一个文件名,我们可以简单地传递一个 io.Reader 作为 抽象 的数据源 。
它是文件吗?一个HTTP正文?字节缓冲区?这并不重要,因为我们仍然会使用相同的 Read 方法 。
在我们的例子中,我们甚至可以缓冲输入以逐行读取它 。所以 , 我们可以使用 bufio.Reader 它的 ReadLine 方法:
现在,打开文件本身的责任委托给 count 客户:
使用第二种实现,无论 实际数据源 如何,都可以调用该函数 。同时,它将 促进 我们的单元测试,因为我们可以简单地创建一个 bufio.Reader 来自 string :
翻译自:
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接口,具有缓存 。注意:缓存是放在主存中,既然是保存在主存里,断电会丢失数据,那么要及时保存数据 。

推荐阅读