首頁 >後端開發 >Golang >Go語言怎麼讀取檔案?多種方式淺析

Go語言怎麼讀取檔案?多種方式淺析

青灯夜游
青灯夜游轉載
2023-04-20 18:28:453747瀏覽

Go語言怎麼讀取檔案?多種方式淺析

這篇文章將討論如何在 Golang 中讀取檔案。我們將使用以下套件來處理這些文件。

  • os 套件提供了一個獨立於平台的介面來執行操作級操作。
  • IOutil 軟體包提供了易於使用的實用程式函數來處理文件,而無需了解太多內部實作。
  • bufio 套件實現了緩衝 IO,這有助於我們提高輸入和輸出作業的效能和吞吐量。
  • log 套件實作一個簡單的日誌記錄套件。我們將在整個程序中使用它。我們將在程式中使用日誌包的 Fatal() 函數。

整個檔案讀取

我們可以輕鬆地一次讀取整個檔案並將其儲存在一個變數中。但請記住,我們不應該對大文件這樣做。我們將使用ioutil.ReadFile() 函數來讀取檔案並將檔案的內容儲存在一個變數中。

首先,讓我們在我們程式所在的相同目錄下儲存一個檔案。因此,我們的資料夾結構將是下面這樣的。

___ 
| 
|_ _ _ _ ilovego.txt | 
|_ _ _ _ main.go

我們在main.go 函數中寫入如下的內容:

package main

import (
	"fmt"
	"io/ioutil"
	"log"
)

func main() {

	content, err := ioutil.ReadFile("ilovego.txt")

	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(string(content))
}

但首先,讓我們討論一下ReadFile() 函數的情況:

  • 定義:方法宣告func ReadFile(filename string) ([]byte, error)
  • 功能:讀取路徑被傳入函數參數的文件,並傳回文件的內容。在內部使用 os.ReadFile(fileName) 方法
  • 傳回:在一個位元組陣列中傳回檔案的內容和錯誤。一個成功的呼叫將會回傳err == nil

內部ReadFile 函數實作如下:

func ReadFile(filename string) ([]byte, error) {
    return os.ReadFile(filename)
}

現在,讓我們回到我們的程式:

  • ioutil.ReadFile("readthisfile.txt") 傳回一個byteArray 和一個err。我們將byteArray 儲存在 "content "變數中,錯誤儲存在 " err "變數中。
  • 然後我們放置了一個 if 條件,如果 err 值不為 nil,我們將使用 log.Fatal() 函數列印錯誤 err 。記住,Fatal() 函數等同於 Print() 函數,然後呼叫 os.Exit(1)
  • 最後,我們將使用 fmt.Println() 函數列印檔案的內容。我們不能簡單地列印content 變量,因為它是一個位元組數組,我們需要將它轉換為字串: string(content)
##然後新建一個

ilovego.txt 文件,寫入如下內容:

I Love Golang,
This is One of the Best Languages on the World!

最後,執行上述程式碼,可以看到如下輸出:

$ go run main.go
I Love Golang, 
This is One of the Best Languages on the World!

按行讀取

Scanner 掃描器提供了一個方便的介面來讀取數據,例如由新行分隔的文字行組成的檔案。它透過標記來讀取資料;

Split 函數定義了標記。預設情況下,函數將資料分成幾行,並剝離了行端。

package main

import (
	"fmt"
	// "io/ioutil"
	"bufio"
	"log"
	"os"
)

func main() {

	// opening the file using Open function
	f, err := os.Open("ilovego.txt")

	if err != nil {
		log.Fatal(err)
	}

	defer f.Close()

	// create a scanner for the file
	scanner := bufio.NewScanner(f)

	// loop through the scanner until it return fasle
	for scanner.Scan() {

		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		log.Fatal(err)
	}
}

  • os.Open() 開啟參數中傳遞的檔案。如果在開啟檔案時遇到任何錯誤,它將返回相同的錯誤。否則,錯誤將是 nil。
  • 然後,我們使用掃描器來讀取文件,並逐行掃描,直到文件內容結束。
  • 最後,我們要關閉該檔案。
執行程序,結果如下:

Go語言怎麼讀取檔案?多種方式淺析

#逐個字讀取

我們還可以透過逐字讀取檔案:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {

	f, err := os.Open("ilovego.txt")

	if err != nil {
		fmt.Println(err)
	}

	defer f.Close()

	scanner := bufio.NewScanner(f)
	scanner.Split(bufio.ScanWords)

	for scanner.Scan() {

		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		fmt.Println(err)
	}
}

運行程式碼:

$ go run main.go
I
Love
Golang,
This
is
One
of
the
Best
Languages
on
the
World!

#以資料區塊的形式讀取檔案

一次讀取整個文件似乎是一種簡單的方法,但有時我們需要從記憶體管理的角度來使我們的程式得到一些最佳化。 Golang 提供了一種分割讀取檔案的方法,而不是整個或甚至逐行讀取。因為如果一行的大小太大,逐行讀取也可能是低效率的。

package main

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
)

func main() {

	f, err := os.Open("ilovego.txt")

	if err != nil {
		log.Fatal(err)
	}

	defer f.Close()

	reader := bufio.NewReader(f)
	buf := make([]byte, 16)

	for {
                // reading a file upto buffer
		n, err := reader.Read(buf)

		if err != nil {

			if err != io.EOF {

				log.Fatal(err)
			}

			break
		}

		fmt.Print(string(buf[0:n]))
	}

	fmt.Println()
}

二進位讀取

hex 套件實作了十六進位的編碼和解碼。

package main

import (
	"bufio"
	"encoding/hex"
	"fmt"
	"io"
	"log"
	"os"
)

func main() {

	f, err := os.Open("sid.jpg")

	if err != nil {
		log.Fatal(err)
	}

	defer f.Close()

	reader := bufio.NewReader(f)
	buf := make([]byte, 256)

	for {
		_, err := reader.Read(buf)

		if err != nil {
			if err != io.EOF {
				fmt.Println(err)
			}
			break
		}

		fmt.Printf("%s", hex.Dump(buf))
	}
}

总结

本文介绍了 Go 语言读取文件的几种方式,ioutil.ReadFile 函数将整个文件读成一个字符串。这个函数很方便,但不应该用于非常大的文件。希望能对你有所帮助!

推荐学习:Golang教程

以上是Go語言怎麼讀取檔案?多種方式淺析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除