Golang?使用os?庫(kù)的?ReadFile()?讀文件最佳實(shí)踐
前言
在 Go 中,os 庫(kù)的 ReadFile() 方法經(jīng)常用作讀文件,相比其他這個(gè)方法很方便,無(wú)需關(guān)心 close 文件等一些工作。
下面列出三種常見(jiàn)的讀文件場(chǎng)景:
1. 讀取整個(gè)文件到內(nèi)存中
使用 os 庫(kù)的 ReadFile() 可以把整個(gè)文件讀到內(nèi)存中,在日常開發(fā)中,這是讀文件使用頻率最多的方法,也是最基本一個(gè)函數(shù)。下面代碼展示了如何使用這個(gè)函數(shù)。
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. 讀取特定字節(jié)數(shù)據(jù)到內(nèi)存中
當(dāng)文件過(guò)大時(shí),讀取整個(gè)文件到內(nèi)存中會(huì)把內(nèi)存打爆,鑒于這種情況,我們可以把整個(gè)文件分成特定 chunks,也就是塊,然后分塊讀取,下面代碼展示了把 3 個(gè) byte 組成一個(gè) 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 個(gè) byte slice,每次讀取 3 個(gè) byte b := make([]byte, 3) // 循環(huán)讀取,直到讀到文件的結(jié)尾, 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. 按行讀取文件到內(nèi)存中
我們也可以按行分割整個(gè)文件,然后一行行讀取到內(nèi)存中,這種方法也可以減少內(nèi)存的壓力
package main import ( "bufio" "log" "os" ) func main() { f, err := os.Open("./file.txt") if err != nil { log.Fatal(err) } defer f.Close() // 以這個(gè)文件為參數(shù),創(chuàng)建一個(gè) 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) } }
到此這篇關(guān)于Golang 使用os 庫(kù)的 ReadFile() 讀文件最佳實(shí)踐的文章就介紹到這了,更多相關(guān)Golang讀文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言學(xué)習(xí)之時(shí)間函數(shù)使用詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中時(shí)間函數(shù)的使用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2022-04-04gin自定義中間件解決requestBody不可重復(fù)讀問(wèn)題(最新推薦)
這篇文章主要介紹了gin自定義中間件解決requestBody不可重復(fù)讀問(wèn)題,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解
這篇文章主要為大家介紹了Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Go中阻塞以及非阻塞操作實(shí)現(xiàn)(Goroutine和main Goroutine)
本文主要介紹了Go中阻塞以及非阻塞操作實(shí)現(xiàn)(Goroutine和main Goroutine),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05go語(yǔ)言開發(fā)環(huán)境安裝及第一個(gè)go程序(推薦)
這篇文章主要介紹了go語(yǔ)言開發(fā)環(huán)境安裝及第一個(gè)go程序,這篇通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Go語(yǔ)言常見(jiàn)錯(cuò)誤之將接口定義在實(shí)現(xiàn)方
在Go中,接口起到一個(gè)十分關(guān)鍵的角色,它們提供了一種方式來(lái)定義對(duì)象的行為,而不需要知道對(duì)象的具體實(shí)現(xiàn),一個(gè)常見(jiàn)的錯(cuò)誤是在實(shí)現(xiàn)方而不是使用方定義接口,本文將詳細(xì)探討為何這樣做是一個(gè)錯(cuò)誤,以及如何避免它2024-01-01golang值類型轉(zhuǎn)換成[]uint8類型的操作
這篇文章主要介紹了golang值類型轉(zhuǎn)換成[]uint8類型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05