日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Golang?使用os?庫的?ReadFile()?讀文件最佳實踐_Golang

作者:二牛QAQ ? 更新時間: 2022-11-15 編程語言

前言

在 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)
    }
}

原文鏈接:https://juejin.cn/post/7116153100112494600

欄目分類
最近更新