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

 更新时间:2014年12月03日 15:59:48   投稿:shichen2014  
这篇文章主要介绍了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)
}

希望本文所述对大家的GO语言程序设计有所帮助。

相关文章

  • Go语言中的sync包同步原语最新详解

    Go语言中的sync包同步原语最新详解

    Go语言在sync包中提供了一套多才多艺的同步机制,以及用于管理对共享资源的并发访问的原子操作,了解这些工具并为您的并发需求选择合适的工具是编写高效可靠的并发Go程序的关键,这篇文章主要介绍了Go语言中的`sync`包同步原语,需要的朋友可以参考下
    2023-12-12
  • go内存缓存BigCache使用入门详解

    go内存缓存BigCache使用入门详解

    这篇文章主要为大家介绍了go内存缓存BigCache使用入门详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Go get命令使用socket代理的方法

    Go get命令使用socket代理的方法

    由于某些不可描述的原因,国内使用 go get 命令安装某些包的时候会超时导致失败,比如 net 包、 sys 包、 tools 包等。这篇文章给大家介绍go get 命令使用socket 代理的方法,感兴趣的朋友一起看看吧
    2018-10-10
  • go并发实现素数筛的代码

    go并发实现素数筛的代码

    这篇文章主要介绍了go并发实现素数筛的代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • go语言实现屏幕截图的示例代码

    go语言实现屏幕截图的示例代码

    屏幕截图在很多地方都可以 用到,本文主要介绍了go语言实现屏幕截图的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • golang中包无法引入问题解决

    golang中包无法引入问题解决

    本文主要介绍了golang中包无法引入问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 从基础到高阶解析Go语言中数组的应用

    从基础到高阶解析Go语言中数组的应用

    在本文中,我们将从基础概念、常规操作,到高级技巧和特殊操作,带大家深入了解Go语言中数组的各个方面,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Go语言基础语法之结构体及方法详解

    Go语言基础语法之结构体及方法详解

    结构体类型可以用来保存不同类型的数据,也可以通过方法的形式来声明它的行为。本文将介绍go语言中的结构体和方法,以及“继承”的实现方法
    2021-09-09
  • Go 使用Unmarshal将json赋给struct出错的原因及解决

    Go 使用Unmarshal将json赋给struct出错的原因及解决

    这篇文章主要介绍了Go 使用Unmarshal将json赋给struct出错的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 详解Golang如何实现节假日不打扰用户

    详解Golang如何实现节假日不打扰用户

    这篇文章主要为大家介绍了Golang如何实现节假日不打扰用户过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论