Golang 使用os 库的 ReadFile() 读文件最佳实践

 更新时间:2022年09月26日 11:20:43   作者:二牛QAQ  
这篇文章主要介绍了Golang使用os库的ReadFile()读文件最佳实践,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言

在 Go 中,os 库的 ReadFile() 方法经常用作读文件,相比其他这个方法很方便,无需关心 close 文件等一些工作。

下面列出三种常见的读文件场景:

1. 读取整个文件到内存中

使用 os 库的 ReadFile() 可以把整个文件读到内存中,在日常开发中,这是读文件使用频率最多的方法,也是最基本一个函数。下面代码展示了如何使用这个函数。

package main

import (
   "log"
   "os"
)

func main() {
   data, err := os.ReadFile("./file.txt")
   if err != nil {
      log.Fatalf("File reading error: %v", err)
   }
   log.Printf("Contents of file: %s", string(data))
}

2. 读取特定字节数据到内存中

当文件过大时,读取整个文件到内存中会把内存打爆,鉴于这种情况,我们可以把整个文件分成特定 chunks,也就是块,然后分块读取,下面代码展示了把 3 个 byte 组成一个 chunk,然后再读取。

package main

import (
   "bufio"
   "io"
   "log"
   "os"
)
func main() {
   f, err := os.Open("./file.txt")
   if err != nil {
      log.Fatal(err)
   }
   defer f.Close()

   // 初始化 reader 读文件
   r := bufio.NewReader(f)
   // 初始化 3 个 byte slice,每次读取 3 个 byte
   b := make([]byte, 3)
   // 循环读取,直到读到文件的结尾,
   for {
      n, err := r.Read(b)
      if err == io.EOF {
         break
      }
      if err != nil {
         log.Fatalf("Error reading file: %v", err)
         break
      }
      log.Printf("the Content is: %s", string(b[0:n]))
   }
}

3. 按行读取文件到内存中

我们也可以按行分割整个文件,然后一行行读取到内存中,这种方法也可以减少内存的压力

package main

import (
    "bufio"
    "log"
    "os"
)

func main() {
    f, err := os.Open("./file.txt")
    if err != nil {
        log.Fatal(err)
    }

    defer f.Close()

    // 以这个文件为参数,创建一个 scanner
    s := bufio.NewScanner(f)
    // 扫描每行文件,按行读取
    for s.Scan() {
        log.Printf("the Content is: %s", s.Text())
    }
    err = s.Err()
    if err != nil {
        log.Fatal(err)
    }
}

到此这篇关于Golang 使用os 库的 ReadFile() 读文件最佳实践的文章就介绍到这了,更多相关Golang读文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang通过mysql语句实现分页查询

    golang通过mysql语句实现分页查询

    这篇文章主要介绍了golang通过mysql语句实现分页查询,文章内容介绍详细,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-03-03
  • 详解Go语言中select语句的常见用法

    详解Go语言中select语句的常见用法

    这篇文章主要是来和大家介绍一下Go语言中select 语句的常见用法,以及在使用过程中的注意事项,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-07-07
  • Golang切片和数组拷贝详解(浅拷贝和深拷贝)

    Golang切片和数组拷贝详解(浅拷贝和深拷贝)

    这篇文章主要为大家详细介绍一下Golang切片拷贝和数组拷贝,文中有详细的代码示例供大家参考,需要的可以参考一下
    2023-04-04
  • Go实现文件分片上传

    Go实现文件分片上传

    这篇文章主要为大家详细介绍了Go实现文件分片上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 秒懂Golang匿名函数

    秒懂Golang匿名函数

    所谓匿名函数,就是没有名字的函数,本文重点给大家介绍Golang匿名函数的相关知识,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Go模块布局管理文档翻译理解

    Go模块布局管理文档翻译理解

    这篇文章主要为大家介绍了Go模块布局管理文档翻译理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • golang-gin-mgo高并发服务器搭建教程

    golang-gin-mgo高并发服务器搭建教程

    这篇文章主要介绍了golang-gin-mgo高并发服务器搭建教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言中的上下文取消操作详解

    Go语言中的上下文取消操作详解

    这篇文章主要给大家介绍了关于Go语言中上下文取消操作的相关资料,本文将解释我们如何利用上下文库的取消特性,并通过一些模式和最佳实践来使用取消,使你的程序更快、更健壮。需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • 深入了解Golang中Slice切片的使用

    深入了解Golang中Slice切片的使用

    本文主要为大家详细介绍了Golang中Slice切片的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-02-02
  • Golang实现自己的Redis(pipeline客户端)实例探索

    Golang实现自己的Redis(pipeline客户端)实例探索

    这篇文章主要为大家介绍了Golang实现自己的Redis(pipeline客户端)实例探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论