Go語(yǔ)言讀取文件的四種方式
前言
這篇文章將討論如何在 Golang 中讀取文件。我們將使用以下包來(lái)處理這些文件。
- os 包提供了一個(gè)獨(dú)立于平臺(tái)的接口來(lái)執(zhí)行操作級(jí)操作。
- IOutil 軟件包提供了易于使用的實(shí)用程序函數(shù)來(lái)處理文件,而無(wú)需了解太多內(nèi)部實(shí)現(xiàn)。
- bufio 包實(shí)現(xiàn)了緩沖 IO,這有助于我們提高輸入和輸出操作的性能和吞吐量。
- log 包實(shí)現(xiàn)一個(gè)簡(jiǎn)單的日志記錄包。我們將在整個(gè)程序中使用它。我們將在程序中使用日志包的
Fatal()函數(shù)。
整個(gè)文件讀取
我們可以很容易地一次性讀取整個(gè)文件并將其存儲(chǔ)在一個(gè)變量中。但請(qǐng)記住,我們不應(yīng)該對(duì)大文件這樣做。我們將使用ioutil.ReadFile() 函數(shù)來(lái)讀取文件并將文件的內(nèi)容存儲(chǔ)在一個(gè)變量中。
首先,讓我們?cè)谖覀兂绦蛩诘耐荒夸浵麓鎯?chǔ)一個(gè)文件。因此,我們的文件夾結(jié)構(gòu)將是下面這樣的。
___ | |_ _ _ _ ilovego.txt | |_ _ _ _ main.go
我們?cè)?main.go 函數(shù)中寫(xiě)入如下的內(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)方法 - 返回:在一個(gè)字節(jié)數(shù)組中返回文件的內(nèi)容和錯(cuò)誤。一個(gè)成功的調(diào)用將返回 err == nil
內(nèi)部 ReadFile 函數(shù)實(shí)現(xiàn)如下:
func ReadFile(filename string) ([]byte, error) {
return os.ReadFile(filename)
}
現(xiàn)在,讓我們回到我們的程序:
ioutil.ReadFile("readthisfile.txt")返回一個(gè) byteArray 和一個(gè) err。我們將byteArray 存儲(chǔ)在 "content "變量中,錯(cuò)誤存儲(chǔ)在 " err "變量中。- 然后我們放置了一個(gè) if 條件,如果 err 值不為 nil,我們將使用
log.Fatal()函數(shù)打印錯(cuò)誤 err 。記住,Fatal()函數(shù)等同于Print()函數(shù),然后調(diào)用os.Exit(1)。 - 最后,我們將使用
fmt.Println()函數(shù)打印文件的內(nèi)容。 我們不能簡(jiǎn)單地打印content變量,因?yàn)樗且粋€(gè)字節(jié)數(shù)組,我們需要將它轉(zhuǎn)換為字符串:string(content)
然后新建一個(gè) ilovego.txt 文件,寫(xiě)入如下內(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 掃描器提供了一個(gè)方便的接口來(lái)讀取數(shù)據(jù),比如一個(gè)由新行分隔的文本行組成的文件。它通過(guò)標(biāo)記來(lái)讀取數(shù)據(jù);Split 函數(shù)定義了標(biāo)記。默認(rèn)情況下,該函數(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()打開(kāi)參數(shù)中傳遞的文件。如果在打開(kāi)文件時(shí)遇到任何錯(cuò)誤,它將返回同樣的錯(cuò)誤。否則,錯(cuò)誤將是 nil。- 然后,我們使用掃描器來(lái)讀取文件,并逐行掃描,直到文件內(nèi)容結(jié)束。
- 最后,我們要關(guān)閉該文件。
執(zhí)行程序,結(jié)果如下:

逐個(gè)單詞讀取
我們還可以通過(guò)逐個(gè)單詞來(lái)讀取文件:
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)
}
}
運(yùn)行代碼:
$ go run main.go I Love Golang, This is One of the Best Languages on the World!
以數(shù)據(jù)塊的形式讀取文件
一次性讀取整個(gè)文件似乎是一種簡(jiǎn)單的方法,但有時(shí)我們需要從內(nèi)存管理的角度使我們的程序得到一些優(yōu)化。Golang 提供了一種分塊讀取文件的方法,而不是整個(gè)或甚至逐行讀取。因?yàn)槿绻恍械拇笮√螅鹦凶x取也可能是低效的。
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()
}
二進(jìn)制讀取
hex 包實(shí)現(xiàn)了十六進(jì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 語(yǔ)言讀取文件的幾種方式,ioutil.ReadFile 函數(shù)將整個(gè)文件讀成一個(gè)字符串。這個(gè)函數(shù)很方便,但不應(yīng)該用于非常大的文件。
到此這篇關(guān)于Go語(yǔ)言讀取文件的四種方式的文章就介紹到這了,更多相關(guān)Go 讀取文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言編譯時(shí)為exe添加圖標(biāo)和屬性信息的方法
在使用Go語(yǔ)言開(kāi)發(fā)應(yīng)用程序時(shí),有個(gè)非常方便的地方就是編譯得到的可執(zhí)行文件可以不依賴任何動(dòng)態(tài)鏈接庫(kù)、并且不需要任何運(yùn)行環(huán)境即可運(yùn)行,本文給大家介紹Go編譯時(shí)為exe添加圖標(biāo)和屬性信息的方法,需要的朋友可以參考下2023-09-09
CentOS7使用yum安裝Golang的超詳細(xì)步驟
CentOS默認(rèn)并沒(méi)有安裝golang運(yùn)行環(huán)境,下面這篇文章主要給大家介紹了關(guān)于CentOS7使用yum安裝Golang的超詳細(xì)步驟,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫(kù)
Go 語(yǔ)言是一門(mén)適合用于編寫(xiě)高效且并發(fā)的 Web 應(yīng)用程序的編程語(yǔ)言,同時(shí)也可以使用它進(jìn)行數(shù)據(jù)處理和分析,本文主要介紹了如何通過(guò)go語(yǔ)言實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫(kù),感興趣的小伙伴可以了解下2025-04-04
Golang如何編寫(xiě)內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體
這篇文章主要介紹了Golang如何編寫(xiě)內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體,結(jié)構(gòu)體是包含多個(gè)字段的集合類型,用于將數(shù)據(jù)組合為記錄2022-07-07
Golang中Channel實(shí)戰(zhàn)技巧與一些說(shuō)明
channel是Go語(yǔ)言內(nèi)建的first-class類型,也是Go語(yǔ)言與眾不同的特性之一,下面這篇文章主要給大家介紹了關(guān)于Golang中Channel實(shí)戰(zhàn)技巧與一些說(shuō)明的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
Go語(yǔ)言并發(fā)之context標(biāo)準(zhǔn)庫(kù)的使用詳解
Context的出現(xiàn)是為了解決在大型應(yīng)用程序中的并發(fā)環(huán)境下,協(xié)調(diào)和管理多個(gè)goroutine之間的通信、超時(shí)和取消操作的問(wèn)題,本文就來(lái)和大家簡(jiǎn)單聊聊它的具體用法,希望對(duì)大家有所幫助2023-06-06
golang 實(shí)現(xiàn)每隔幾分鐘執(zhí)行一個(gè)函數(shù)
這篇文章主要介紹了golang 實(shí)現(xiàn)每隔幾分鐘執(zhí)行一個(gè)函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go語(yǔ)言實(shí)現(xiàn)關(guān)閉http請(qǐng)求的方式總結(jié)
面試的時(shí)候問(wèn)到如何關(guān)閉http請(qǐng)求,一般人脫口而出的是關(guān)閉response.body,這是錯(cuò)誤的。本文為大家整理了三個(gè)正確關(guān)閉http請(qǐng)求的方法,希望對(duì)大家有所幫助2023-02-02

