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。
然後,我們使用掃描器來讀取文件,並逐行掃描,直到文件內容結束。 最後,我們要關閉該檔案。
#逐個字讀取
我們還可以透過逐字讀取檔案: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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

Go編程中的資源管理:Mysql和Redis的連接與釋放在學習Go編程過程中,如何正確管理資源,特別是與數據庫和緩存�...

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。
