一文搞懂Go語(yǔ)言中文件的讀寫(xiě)與創(chuàng)建
1. 文件的打開(kāi)與關(guān)閉
1.1 os.open
os.open 函數(shù)能打開(kāi)一個(gè)文件 調(diào)用 close() 方法 關(guān)閉文件
//打開(kāi)文件
open, err := os.Open("./1.text")
if err != nil {
//打印異常信息
fmt.Println("open file err", err)
}
fmt.Println("文件獲取完畢")
//沒(méi)有出現(xiàn)異常,關(guān)閉文件
open.Close()
為了防止忘記關(guān)閉文件,通常都將關(guān)閉文件的代碼寫(xiě)在 defer中
//打開(kāi)文件
open, err := os.Open("./1.text")
defer func() {
if open != nil {
// 關(guān)閉文件
open.Close()
}
}()
if err != nil {
//打印異常信息
fmt.Println("open file err", err)
}
fmt.Println("文件獲取完畢")
1.2 os.OpenFile() 指定模式打開(kāi)文件
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
其中:
name:要打開(kāi)的文件名 flag:打開(kāi)文件的模式。 模式有以下幾種:
| 模式 | 含義 |
|---|---|
| os.O_WRONLY | 只寫(xiě) |
| os.O_CREATE | 創(chuàng)建文件 |
| os.O_RDONLY | 只讀 |
| os.O_RDWR | 讀寫(xiě) |
| os.O_TRUNC | 清空 |
| os.O_APPEND | 追加 |
perm:文件權(quán)限,一個(gè)八進(jìn)制數(shù)。r(讀)04,w(寫(xiě))02,x(執(zhí)行)01。
2. 文件的讀取
2.1 打開(kāi)文件的方式讀取文件中的數(shù)據(jù)
//首先需要打開(kāi)一個(gè)文件
open, err := os.Open("./1.text")
defer func() {
e := recover()
if e != nil {
fmt.Println("打開(kāi)文件出現(xiàn)了異常", e)
}
}()
if err != nil {
// 如果有異常 沒(méi)必要往下走了 拋出
panic(err)
}
//如果沒(méi)有異常
//創(chuàng)建 字節(jié)切片
bytes := make([]byte, 1024)
defer func() {
e := recover()
if e != nil {
fmt.Println("讀取文件出現(xiàn)了異常", e)
}
}()
for {
//循環(huán)讀
_, err := open.Read(bytes)
if err != nil {
panic(err)
}
//打印結(jié)果
fmt.Println(string(bytes))
}
2.2 使用 bufio 整行讀取文件
bufio 是在file的基礎(chǔ)上封裝了一層API , 支持更多的功能
//同樣的首先打開(kāi)一個(gè)文件
file, err := os.Open("./1.text")
defer recover()
if err != nil {
panic("文件打開(kāi)出現(xiàn)異常")
}
// 封裝為 bufio
reader := bufio.NewReader(file)
defer recover()
for {
//讀到指定字符串換一行
line, _, err := reader.ReadLine()
if err != nil {
if err == io.EOF {
fmt.Println("文件讀寫(xiě)完畢")
break
}
panic("文件讀取出現(xiàn)異常")
}
fmt.Println(string(line))
}
fmt.Println("程序運(yùn)行結(jié)束")
func main() {
file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
}
3. 寫(xiě)入文件操作
無(wú)論是文件讀取還是文件寫(xiě)入 都是需要先打開(kāi)文件 再進(jìn)行操作
3.1 file.Write 與 file.WriteString
// 首先打開(kāi)文件 O_RDWR 讀寫(xiě)權(quán)限 O_TRUNC 清空文件 0 開(kāi)頭表示八進(jìn)制 666表示 當(dāng)用用戶 當(dāng)前組 其他用戶 都是可讀可寫(xiě)權(quán)限
file, err := os.OpenFile("1.text", os.O_RDWR|os.O_TRUNC, 0666)
if err != nil {
fmt.Printf("打開(kāi)文件出現(xiàn)異常 %v", err)
}
defer file.Close()
// 返回 寫(xiě)入的字節(jié)數(shù)
write, err := file.Write([]byte("測(cè)試文件寫(xiě)入 \n"))
file.WriteString("一次寫(xiě)入整個(gè)字符串")
if err != nil {
fmt.Println(err)
}
fmt.Println(write)
3.2 bufio.NewWriter
// 基于緩存操作
file, err := os.OpenFile("2.text", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
if err != nil {
panic(err)
}
defer func() {
file.Close()
if e := recover(); e != nil {
fmt.Printf("異常 : 打開(kāi)文件出現(xiàn)異常 %v", e)
}
}()
// 使用 bufio 基于緩存操作io流
// 需要傳入 一個(gè) io 接口包下的 Writer 接口實(shí)現(xiàn)類 而 file 實(shí)現(xiàn)了該 方法
writer := bufio.NewWriter(file)
writer.WriteString(" 寫(xiě)入緩存字符串內(nèi)容 2")
//需要將緩存中的數(shù)據(jù)刷新到硬盤(pán)上
writer.Flush()

3.3 ioUtil 工具類
// 使用工具類 打開(kāi)文件,寫(xiě)入文件一氣呵成
err := ioutil.WriteFile("3.text", []byte("工具類寫(xiě)入內(nèi)容"), 0666)
if err != nil {
fmt.Println("程序運(yùn)行出現(xiàn)異常", err)
}
到此這篇關(guān)于一文搞懂Go語(yǔ)言中文件的讀寫(xiě)與創(chuàng)建的文章就介紹到這了,更多相關(guān)Go語(yǔ)言 文件讀寫(xiě) 創(chuàng)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的并發(fā)網(wǎng)頁(yè)爬蟲(chóng)示例
在這個(gè)章節(jié)中,我們將會(huì)結(jié)合之前的知識(shí)點(diǎn),實(shí)現(xiàn)一個(gè)簡(jiǎn)易的并發(fā)網(wǎng)頁(yè)爬蟲(chóng),我們的爬蟲(chóng)會(huì)先爬取一個(gè)起始頁(yè)面,提取出所有的鏈接,然后并發(fā)地爬取這些鏈接,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-08-08
golang實(shí)踐-第三方包為私有庫(kù)的配置方案
這篇文章主要介紹了golang實(shí)踐-第三方包為私有庫(kù)的配置方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類型字符串
字符串在Go語(yǔ)言中以原生數(shù)據(jù)類型出現(xiàn),使用字符串就像使用其他原生數(shù)據(jù)類型(int、bool、float32、float64 等)一樣,下面這篇文章主要給大家介紹了關(guān)于GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類型字符串的相關(guān)資料,需要的朋友可以參考下2022-04-04
Go語(yǔ)言pointer及switch?fallthrough實(shí)戰(zhàn)詳解
這篇文章主要為大家介紹了Go語(yǔ)言pointer及switch?fallthrough實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
go-zero讀取請(qǐng)求體出現(xiàn)EOF錯(cuò)誤的解決方法
這篇文章主要為大家詳細(xì)介紹了go-zero讀取請(qǐng)求體出現(xiàn)EOF錯(cuò)誤時(shí)如何解決,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
Golang發(fā)送Get和Post請(qǐng)求的實(shí)現(xiàn)
做第三方接口有時(shí)需要用Get或者Post請(qǐng)求訪問(wèn),本文主要介紹了Golang發(fā)送Get和Post請(qǐng)求的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05

