Go語(yǔ)言中常見(jiàn)的文件操作分享
常用包
文件操作應(yīng)該是應(yīng)用程序里非常常見(jiàn)的一種操作,無(wú)論是哪種應(yīng)用場(chǎng)景,幾乎都離不開文件的基本操作。Go語(yǔ)言中提供了三個(gè)不同的包去處理文件
os
os包提供了處理文件的API接口,遵循Unix標(biāo)準(zhǔn),平臺(tái)無(wú)關(guān),所有操作系統(tǒng)都可以使用。錯(cuò)誤處理上是Go語(yǔ)言獨(dú)有的,失敗時(shí),返回的是錯(cuò)誤類型而非系統(tǒng)錯(cuò)誤編號(hào),對(duì)于調(diào)試很有幫助。os包中提供了創(chuàng)建、刪除、打開、修改權(quán)限等功能。
與I/O操作相關(guān)包
io
- I/O原語(yǔ)接口
- 包裝到了公共接口中,該接口抽象了功能
ioutil
I/O實(shí)用功能,從Go 1.6開始,可以直接通過(guò)io后os包訪問(wèn)相同的功能
bufio
- 文件的緩沖I/O提供接口
- 緩沖區(qū)實(shí)際是內(nèi)存中的臨時(shí)空間,用于存儲(chǔ)數(shù)據(jù)并在該空間執(zhí)行臨時(shí)I/O操作,減少系統(tǒng)調(diào)用及磁盤I/O,適用于數(shù)據(jù)塊傳輸場(chǎng)景,不適用于單個(gè)字符的I/O操作
- 默認(rèn)的操作都是無(wú)緩沖的
常用文件/目錄操作
路徑拼接
package main import ( "fmt" "path" ) func JoinPath() { dirs := []string{"/", "home", "ray", "workspace"} path := path.Join(dirs...) fmt.Printf("Path after join: %v\n", path) } func main() { JoinPath() }
輸出信息為
Path after join: /home/ray/workspace
更多功能請(qǐng)參考:https://pkg.go.dev/path/filepath#pkg-functions
創(chuàng)建文件(touch)
改代碼執(zhí)行后將生成一個(gè)為空的sample.txt文件
package main import ( "log" "os" ) func CreateEmptyFile() { myFile, err := os.Create("sample.txt") if err != nil { log.Fatal("ERROR! ", err) } log.Println("Empty file created successfully. ", myFile) myFile.Close() } func main() { CreateEmptyFile() }
獲取文件信息
這里主要使用os.Stat函數(shù)
package main import ( "fmt" "log" "os" ) func FileInfo() { fileInfo, err := os.Stat("sample.txt") if err != nil { log.Fatal(err) } fmt.Println("File Name:", fileInfo.Name()) fmt.Println("Size ", fileInfo.Size(), " bytes") fmt.Println("Permissions:", fileInfo.Mode()) fmt.Println("Last modified:", fileInfo.ModTime()) fmt.Println("Is Directory: ", fileInfo.IsDir()) } func main() { FileInfo() }
讀取文件內(nèi)容
和其他語(yǔ)言類似,讀取文件主要使用Open, Read等函數(shù),文件處理最底層是基于原始字節(jié)的,在這個(gè)抽象之上,可以進(jìn)一步構(gòu)建更方便的接口。
package main import ( "log" "os" ) func FileRead(filePath string) { oFile, err := os.Open(filePath) if err != nil { log.Fatal(err) } defer oFile.Close() buff := make([]byte, 100) for no, err := oFile.Read(buff); err == nil; no, err = oFile.Read(buff) { if no > 0 { os.Stdout.Write(buff[0:no]) } } } func main() { FileRead("sample.txt") }
寫入文件內(nèi)容
我們嘗試使用一個(gè)文件拷貝的樣例,來(lái)學(xué)習(xí)寫入的方式,這里除了剛才使用的os包,還是用了io包,最終將顯示一共拷貝了多少字節(jié)
package main import ( "log" "io" "os" ) func Copy(src, dest string) { srcFile, err := os.Open(src) if err != nil { log.Fatal(err) } defer srcFile.Close() destFile, err := os.Create(dest) if err != nil { log.Fatal(err) } defer destFile.Close() numBytes, err := io.Copy(destFile, srcFile) if err != nil { log.Fatal(err) } log.Printf("Successfully copied %d bytes", numBytes) err = destFile.Sync() if err != nil { log.Fatal(err) } } func main() { Copy("source.txt", "dest.txt") }
到此這篇關(guān)于Go語(yǔ)言中常見(jiàn)的文件操作分享的文章就介紹到這了,更多相關(guān)Go語(yǔ)言文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang基于Vault實(shí)現(xiàn)敏感信息保護(hù)
Vault?是一個(gè)強(qiáng)大的敏感信息管理工具,自帶了多種認(rèn)證引擎和密碼引擎,本文主要探討應(yīng)用程序如何安全地從?Vault?獲取敏感信息,并進(jìn)一步實(shí)現(xiàn)自動(dòng)輪轉(zhuǎn),感興趣的可以了解一下2023-06-06詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理
這篇文章主要介紹了詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Golang當(dāng)中的定時(shí)器實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Golang當(dāng)中定時(shí)器的相關(guān)資料,定時(shí)器的實(shí)現(xiàn)大家應(yīng)該都遇到過(guò),最近在學(xué)習(xí)golang,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP
這篇文章主要為大家介紹了Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06