Go語言實現(xiàn)讀取文件的方式總結(jié)
前言
這篇文章將討論如何在 Golang 中讀取文件。我們將使用以下包來處理這些文件。
- os 包提供了一個獨立于平臺的接口來執(zhí)行操作級操作。
- IOutil 軟件包提供了易于使用的實用程序函數(shù)來處理文件,而無需了解太多內(nèi)部實現(xiàn)。
- bufio 包實現(xiàn)了緩沖 IO,這有助于我們提高輸入和輸出操作的性能和吞吐量。
- log 包實現(xiàn)一個簡單的日志記錄包。我們將在整個程序中使用它。我們將在程序中使用日志包的
Fatal()
函數(shù)。
整個文件讀取
我們可以很容易地一次性讀取整個文件并將其存儲在一個變量中。但請記住,我們不應該對大文件這樣做。我們將使用ioutil.ReadFile()
函數(shù)來讀取文件并將文件的內(nèi)容存儲在一個變量中。
首先,讓我們在我們程序所在的同一目錄下存儲一個文件。因此,我們的文件夾結(jié)構(gòu)將是下面這樣的。
___
|
|_ _ _ _ ilovego.txt |
|_ _ _ _ main.go
我們在 main.go
函數(shù)中寫入如下的內(nèi)容:
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()
函數(shù)的情況:
- 定義:方法聲明 func
ReadFile(filename string) ([]byte, error)
- 功能:讀取路徑被傳入函數(shù)參數(shù)的文件,并返回文件的內(nèi)容。在內(nèi)部使用
os.ReadFile(fileName)
方法 - 返回:在一個字節(jié)數(shù)組中返回文件的內(nèi)容和錯誤。一個成功的調(diào)用將返回 err == nil
內(nèi)部 ReadFile 函數(shù)實現(xiàn)如下:
func ReadFile(filename string) ([]byte, error) { return os.ReadFile(filename) }
現(xiàn)在,讓我們回到我們的程序:
ioutil.ReadFile("readthisfile.txt")
返回一個 byteArray 和一個 err。我們將byteArray 存儲在 "content "變量中,錯誤存儲在 " err "變量中。- 然后我們放置了一個 if 條件,如果 err 值不為 nil,我們將使用
log.Fatal()
函數(shù)打印錯誤 err 。記住,Fatal()
函數(shù)等同于Print()
函數(shù),然后調(diào)用os.Exit(1)
。 - 最后,我們將使用
fmt.Println()
函數(shù)打印文件的內(nèi)容。 我們不能簡單地打印content
變量,因為它是一個字節(jié)數(shù)組,我們需要將它轉(zhuǎn)換為字符串:string(content)
然后新建一個 ilovego.txt
文件,寫入如下內(nèi)容:
I Love Golang,
This is One of the Best Languages on the World!
最后,執(zhí)行上述代碼,可以看到如下輸出:
$ go run main.go
I Love Golang,
This is One of the Best Languages on the World!
按行讀取
Scanner 掃描器提供了一個方便的接口來讀取數(shù)據(jù),比如一個由新行分隔的文本行組成的文件。它通過標記來讀取數(shù)據(jù);Split
函數(shù)定義了標記。默認情況下,該函數(shù)將數(shù)據(jù)分成幾行,并剝離了行端。
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()
打開參數(shù)中傳遞的文件。如果在打開文件時遇到任何錯誤,它將返回同樣的錯誤。否則,錯誤將是 nil。- 然后,我們使用掃描器來讀取文件,并逐行掃描,直到文件內(nèi)容結(jié)束。
- 最后,我們要關閉該文件。
執(zhí)行程序,結(jié)果如下:
逐個單詞讀取
我們還可以通過逐個單詞來讀取文件:
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!
以數(shù)據(jù)塊的形式讀取文件
一次性讀取整個文件似乎是一種簡單的方法,但有時我們需要從內(nèi)存管理的角度使我們的程序得到一些優(yōu)化。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
包實現(xiàn)了十六進制的編碼和解碼。
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)) } }
總結(jié)
本文介紹了 Go 語言讀取文件的幾種方式,ioutil.ReadFile
函數(shù)將整個文件讀成一個字符串。這個函數(shù)很方便,但不應該用于非常大的文件。希望能對你有所幫助!
到此這篇關于Go語言實現(xiàn)讀取文件的方式總結(jié)的文章就介紹到這了,更多相關Go語言讀取文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringEvent優(yōu)雅解耦時連續(xù)兩個bug的解決方案
這篇文章主要為大家介紹了SpringEvent優(yōu)雅解耦時連續(xù)兩個bug的解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12如何在 ubuntu linux 上配置 go 語言的 qt 開發(fā)環(huán)境
這篇文章主要介紹了如何在 ubuntu linux 上配置 go 語言的 qt 開發(fā)環(huán)境,本文分步驟通過實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04GO語言協(xié)程創(chuàng)建使用并通過channel解決資源競爭
這篇文章主要為大家介紹了GO語言協(xié)程創(chuàng)建使用并通過channel解決資源競爭,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04golang 并發(fā)安全Map以及分段鎖的實現(xiàn)方法
這篇文章主要介紹了golang 并發(fā)安全Map以及分段鎖的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03