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", , 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)
}

最新文章

  1. 移动端web开发的那些坑
  2. MongoDB 优化器MongoDB Database Profiler(12)
  3. 【总结】C# 设置委托的机理和简要步骤
  4. Tableau地图移动
  5. gulp实用插件总结
  6. android MediaPlayer API大全已经方法详解(转载)
  7. mysql exists 和 in的效率比较
  8. ACM2030_机内码
  9. Java Collection 集合类大小调整带来的性能消耗
  10. PHP5新语法学习
  11. Atomic 升级
  12. 设计模式 -- 责任链模式或者叫职责链模式(Chain of Responsibility(CoR))
  13. hdu1151有向图的最小顶点覆盖
  14. java中的@Override标签
  15. 推荐安全且匿名的邮箱 ProtonMail -- PGP算法
  16. Java多线程之Join方法阻塞线程
  17. Table Dragger - 简单的 JS 拖放排序表格插件
  18. 计算概论(A)/基础编程练习(数据成分)/2:奥运奖牌计数
  19. scala case类
  20. Unite 2017 | 从《闹闹天宫》看MOBA游戏里的网络同步技术

热门文章

  1. UVALive 5029 字典树
  2. 哈夫曼树(C++优先队列的使用)
  3. Nagios 监控系统架设全攻略
  4. 前端构建工具gulpjs的使用介绍及技巧 (转)
  5. Educational Codeforces Round 2 B. Queries about less or equal elements
  6. spring in action 学习笔记九:如何证明在scope为prototype时每次创建的对象不同。
  7. web页面效果开源框架收集整合
  8. QLineEdit使用总结(转)
  9. glOrthof 与glFrustumf
  10. 在iOS上实现一个简单的日历控件