GO语言常用的文件读取方式

本文实例讲述了GO语言常用的文件读取方式。分享给大家供大家参考。具体分析如下:

Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。

一次性读取

小文件推荐一次性读取,这样程序更简单,而且速度最快。

func ReadAll(filePth string) ([]byte, error) {
 f, err := os.Open(filePth)
 if err != nil {
  return nil, err
 }
 return ioutil.ReadAll(f)
}

还有更加简单的方法,我经常使用ioutil.ReadFile(filePth)

分块读取

可在速度和内存占用之间取得很好的平衡。

package main
import (
 "bufio"
 "io"
 "os"
)
func processBlock(line []byte) {
 os.Stdout.Write(line)
}
func ReadBlock(filePth string, bufSize int, hookfn func([]byte)) error {
 f, err := os.Open(filePth)
 if err != nil {
  return err
 }
 defer f.Close()
 buf := make([]byte, bufSize) //一次读取多少个字节
 bfRd := bufio.NewReader(f)
 for {
  n, err := bfRd.Read(buf)
  hookfn(buf[:n]) // n 是成功读取字节数
  if err != nil { //遇到任何错误立即返回,并忽略 EOF 错误信息
   if err == io.EOF {
    return nil
   }
   return err
  }
 }
 return nil
}
func main() {
 ReadBlock("test.txt", 10000, processBlock)
}

逐行读取

逐行读取有的时候真的很方便,性能可能慢一些,但是仅占用极少的内存空间。

package main
import (
 "bufio"
 "io"
 "os"
)
func processLine(line []byte) {
 os.Stdout.Write(line)
}
func ReadLine(filePth string, hookfn func([]byte)) error {
 f, err := os.Open(filePth)
 if err != nil {
  return err
 }
 defer f.Close()
 bfRd := bufio.NewReader(f)
 for {
  line, err := bfRd.ReadBytes('\n')
  hookfn(line) //放在错误处理前面,即使发生错误,也会处理已经读取到的数据。
  if err != nil { //遇到任何错误立即返回,并忽略 EOF 错误信息
   if err == io.EOF {
    return nil
   }
   return err
  }
 }
 return nil
}
func main() {
 ReadLine("test.txt", processLine)
}

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-02-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Danny的专栏

机房收费系统(VB.NET)——存储过程实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

18750
来自专栏程序员的SOD蜜

PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范

SQL-MAP的目标: 集中管理SQL语句,所有SQL语句放在专门的配置文件中进行管理; 通过替换SQL配置文件,达到平滑切换数据库到另外一个数据库,比如从O...

27780
来自专栏前端小叙

前端如何获取http状态码400的返回值

axios.get("/check_mobile_and_sent_code",{withCredentials:true,params:{mobile:for...

43480
来自专栏数据处理

Delete Duplicate Emails

19340
来自专栏智能大石头

5,ORM组件XCode(动手)

本篇才真正是XCode教程第一篇。《速览》是为了以最简洁的语言最短小的篇幅去吸引开发者;《简介》则是对XCode组件和XCode开发模式的一个整体介绍,让开发者...

22190
来自专栏自动化测试实战

接口测试框架——读取excel文件

36160
来自专栏JAVA后端开发

通用数据级别权限的框架设计与实现(4)-单条记录的权限控制

查看上篇文章通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤,我们开始在原来的基础上实现单条权记录的权限控制。 相信前面的列表权限控制,很多系统都可...

12730
来自专栏令仔很忙

学生信息管理系统--SQL注入

当你在登陆学生管理系统的时候,添加的用户名若和你数据库中的数据不符时,就会弹出一个窗体,告诉你没有这个用户;但是当你在用户名中输入数字或者字母外加英文状态下...

47910
来自专栏ml

------------数据库的加锁操作(上)

       从事一个项目,需要考虑数据的安全性,之前对于数据库这部分的数据操作学习的比较零散,由于手头的项目,于是系统的 学习了下数据库操作加锁的知识: --...

564100
来自专栏Java帮帮-微信公众号-技术文章全总结

Activiti学习详解【面试+工作】

一:Activiti第一天 1:工作流的概念 ? 说明: 1) 假设:这两张图就是XX兄弟的请假流程图 2) 图的组成部分: A. 人物:范XX 冯X刚 王X军...

77650

扫码关注云+社区

领取腾讯云代金券