自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊Go語(yǔ)言中文件操作

開發(fā) 前端
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)限等功能。

常用包

文件操作應(yīng)該是應(yīng)用程序里非常常見的一種操作,無(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)于文件的操作,可以在使用過(guò)程中查詢官方文檔。

? Go語(yǔ)言文件操作大全(https://colobu.com/2016/10/12/go-file-operations/)

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-07-13 06:44:04

Go語(yǔ)言數(shù)組

2024-05-17 08:47:33

數(shù)組切片元素

2023-12-21 07:09:32

Go語(yǔ)言任務(wù)

2023-01-12 08:52:50

GoroutinesGo語(yǔ)言

2021-07-15 23:18:48

Go語(yǔ)言并發(fā)

2024-04-07 11:33:02

Go逃逸分析

2023-03-21 07:57:37

Go語(yǔ)言設(shè)計(jì)模式

2022-07-19 12:25:29

Go

2023-07-29 15:03:29

2023-11-30 08:09:02

Go語(yǔ)言

2024-04-01 00:02:56

Go語(yǔ)言代碼

2023-01-30 15:41:10

Channel控制并發(fā)

2021-06-08 07:45:44

Go語(yǔ)言優(yōu)化

2022-09-29 10:01:05

Go編程語(yǔ)言文本文件

2018-12-11 10:43:09

Go語(yǔ)言 HTTP服務(wù)器

2013-06-25 09:52:32

GoGo語(yǔ)言Go編程

2023-11-21 15:46:13

Go內(nèi)存泄漏

2023-12-30 18:35:37

Go識(shí)別應(yīng)用程序

2023-10-09 07:14:42

panicGo語(yǔ)言

2024-01-08 07:02:48

數(shù)據(jù)設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)