Go語言學(xué)習(xí)之文件操作方法詳解
引言
計(jì)算機(jī)的文件是存儲(chǔ)再外部介質(zhì)(硬盤)上的數(shù)據(jù)集合,文件分為文本文件和二進(jìn)制文件
1. 打開和關(guān)閉文件
os.open()函數(shù)能夠打開一個(gè)文件,返回一個(gè)*File和一個(gè)err,對(duì)得到的文件示例close()方法能夠關(guān)閉文件
close()可以釋放內(nèi)存空間
示例:
package main
import (
"fmt"
"os"
)
func main() {
//系統(tǒng)打開文件并賦予文件實(shí)體
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打開失敗", err)
} else {
fmt.Println("文件打開成功")
file.Close()
fmt.Println("文件關(guān)閉成功")
}
}輸出結(jié)果如下
文件打開失敗 open ./abc.txt: The system cannot find the file specified.
package main
import "fmt"
func hello() {
defer fmt.Println("執(zhí)行defer") //延遲處理,函數(shù)關(guān)閉前執(zhí)行
for i := 0; i < 10; i++ {
fmt.Println(i)
if i == 8 {
//手動(dòng)宕機(jī)處理,立馬關(guān)閉當(dāng)前程序,并釋放內(nèi)存空間
panic("程序宕機(jī)") //閾值
}
}
}
func main() {
hello()
}2. 讀取文件
接收一個(gè)字節(jié)切片,返回讀取的字節(jié)數(shù)和可能的具體錯(cuò)誤,讀到文件末尾時(shí)會(huì)返回0 和 io.EOF
func (f *File) Read(b []byte) (n int,err error)
2.1 defer 語句
示例:
defer—般用于資源的釋放和異常的捕捉。;
defer語句會(huì)將其后面跟隨的語句進(jìn)行延遲處理;跟在defer后面的語言將會(huì)在程序進(jìn)行最后的return之后再執(zhí)行
在defer歸屬的函數(shù)即將返回時(shí),將延遲處理的語句按defer的逆序進(jìn)行執(zhí)行,也就是說,先被defer的語句最后被執(zhí)行,最后被 defer的語句,最先被執(zhí)行。
package main
import "fmt"
func main() {
defer fmt.Println("執(zhí)行defer語句") //延遲處理,函數(shù)關(guān)閉前執(zhí)行
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}輸出結(jié)果如下
0
1
2
3
4
執(zhí)行defer語句
2.2 手動(dòng)宕機(jī)處理
package main
import "fmt"
func hello() {
defer fmt.Println("執(zhí)行defer") //延遲處理,函數(shù)關(guān)閉前執(zhí)行
for i := 0; i < 10; i++ {
fmt.Println(i)
if i == 8 {
//手動(dòng)宕機(jī)處理,立馬關(guān)閉當(dāng)前程序,并釋放內(nèi)存空間
panic("程序宕機(jī)")
}
}
}
func main() {
hello()
}

2.3 打開文件并獲取內(nèi)容
package main
import (
"fmt"
"io"
"os"
)
func main() {
//讀取文件
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打開失敗", err)
return
}
defer file.Close() //main函數(shù)結(jié)束前執(zhí)行文件資源釋放
fmt.Println("文件打開成功")
//定義參數(shù)切片
var result [128]byte
n, err := file.Read(result[:]) //以切片的形式讀取
//文件讀取完成,進(jìn)行判斷
if err == io.EOF {
fmt.Println("文件讀取完畢", err)
return
}
//讀取過程中出現(xiàn)異常
if err != nil {
fmt.Println("文件讀取失敗", err)
return
}
fmt.Printf("字節(jié)數(shù): %d 個(gè)\n", n)
fmt.Printf("獲取的內(nèi)容是: %s", string(result[:]))
}

2.4 bufio 讀取文件
使用bufio讀取,bufio 在 file 的基礎(chǔ)上封裝了一層API,支持更多的功能
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//讀取文件
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打開失敗", err)
return
}
//main函數(shù)結(jié)束前執(zhí)行文件資源釋放
defer file.Close()
//bufio緩沖區(qū)讀取
reader := bufio.NewReader(file)
//循環(huán)讀取內(nèi)存,輸出到程序中
for {
str, err := reader.ReadString('\n') //按行讀取,值賦予給str
if err == io.EOF {
fmt.Print(str) //要輸出,否則不顯示最后一行
// fmt.Println("文件讀取完畢")
return
}
if err != nil {
fmt.Println("文件讀取異常", err)
return
}
fmt.Print(str) //取消ln文件中自帶換行
}
}
2.5 ioutil 讀取文件
package main
import (
"fmt"
"io/ioutil"
)
func ReaderFile(path string) {
content, err := ioutil.ReadFile(path)
if err != nil {
fmt.Println("文件讀取異常")
return
}
fmt.Println(string(content)) //轉(zhuǎn)換string格式并輸出
}
func main() {
ReaderFile("./abc.txt")
}

2.6 讀取奇偶行內(nèi)容
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//讀取文件
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打開失敗", err)
return
}
//main函數(shù)結(jié)束前執(zhí)行文件資源釋放
defer file.Close()
//bufio緩沖區(qū)讀取
reader := bufio.NewReader(file)
//計(jì)數(shù)奇偶行
count := 0
for {
str, _, err := reader.ReadLine()
count++
if err == io.EOF {
// fmt.Println("文件讀取完畢")
return
}
if err != nil {
fmt.Println("文件讀取異常", err)
return
}
if count%2 == 1 {
fmt.Println(string(str))
}
}
}
登錄并判斷用戶名是否存在
package main
import (
"bufio"
"fmt"
"io"
"os"
)
//讀取文件
func main() {
//var doing bool
var name string
fmt.Print("請(qǐng)輸入用戶名:")
fmt.Scan(&name)
//defer fmt.Println("用戶不存在")
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打開失敗", err)
return
}
//main函數(shù)結(jié)束前,執(zhí)行文件資源釋放
defer file.Close()
//利用bufio緩沖區(qū)讀取文件
reader := bufio.NewReader(file) //建立緩沖區(qū),將文件內(nèi)容放入到緩沖區(qū)
//計(jì)數(shù)奇偶行
a := 0
for {
str, _, err := reader.ReadLine()
//每次讀取,a+1
a++
if err == io.EOF {
fmt.Println("文件讀取完畢")
//如果文件讀取完,也沒有返回,則說明用戶不存在
fmt.Println("用戶不存在")
return
}
if err != nil {
fmt.Println("文件讀取錯(cuò)誤")
return
}
if a%2 == 1 {
if name == string(str) {
fmt.Println("登錄成功")
return
}
}
}
}
3. 寫入文件
3.1 os.OpenFile() 函數(shù)
os.OpenFile()函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。
語法格式如下:
func OpenFile(name string,flag int,perm FileMode)(*File,error) {
...
}
name:要打開的文件名
flag:打開文件的模式
模式種類:
模式|含義|
- |os.O_WRONLY|只寫|
- |os.O_CREATE|創(chuàng)建文件|
- |os.O_RDONLY|只讀|
- |os.O_RDWR|讀寫|
- |os.O_TRUNC|清空|
- |os.O_APPEND|追加|
perm:文件權(quán)限,一個(gè)八進(jìn)制數(shù)。r(讀)04,W(寫)02,x(執(zhí)行)01
3.2 Write 和 WriteString 方式寫入
package main
import (
"fmt"
"os"
)
//使用write和writestring寫入
func main() {
//寫入方式打開文件,創(chuàng)建新文件,開啟只寫模式,文件權(quán)限644
file, err := os.OpenFile("abc.txt", os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("文件打開失敗", err)
return
}
//字節(jié)切片寫入
file.Write([]byte("this is byte write\n"))
//字符串寫入
str := "this is string write"
file.WriteString(str)
}

3.3 bufio.NewWriter 方式寫入
package main
import (
"bufio"
"fmt"
"os"
)
//bufio寫入
func main() {
file, err := os.OpenFile("tmp.txt", os.O_CREATE|os.O_WRONLY, 0666) //WRONLY,清空
if err != nil {
fmt.Println("文件打開失敗", err)
return
}
defer file.Close()
//文件寫入緩沖區(qū)
write := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
//內(nèi)容寫入緩沖區(qū)
write.WriteString("this is bufio write\n")
}
//緩沖區(qū)數(shù)據(jù)提交寫入文件
write.Flush()
}

3.4 ioutil.WriteFile 方式寫入
package main
import (
"fmt"
"io/ioutil"
)
func main() {
str := "this is ioutil write\nthis is test content"
//iotuil方式直接寫入,字符串轉(zhuǎn)換成字節(jié)數(shù)組寫入
err := ioutil.WriteFile("./tmp.txt", []byte(str), 0666)
if err != nil {
fmt.Println("文件寫入失敗", err)
return
}
}
以上就是Go語言學(xué)習(xí)之文件操作方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語言文件操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何在Golang中監(jiān)聽多個(gè)channel
這篇文章主要為大家詳細(xì)介紹了如何在Golang中實(shí)現(xiàn)監(jiān)聽多個(gè)channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
go-cqhttp權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼
這篇文章主要介紹了go-cqhttp權(quán)限管理,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
Prometheus Go client library使用方式詳解
這篇文章主要為大家介紹了Prometheus Go client library使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系解析
這篇文章主要為大家介紹了Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

