Go語言學習之文件操作方法詳解
引言
計算機的文件是存儲再外部介質(zhì)(硬盤)上的數(shù)據(jù)集合,文件分為文本文件和二進制文件
1. 打開和關(guān)閉文件
os.open()函數(shù)
能夠打開一個文件,返回一個*File
和一個err
,對得到的文件示例close()
方法能夠關(guān)閉文件
close()可以釋放內(nèi)存空間
示例:
package main import ( "fmt" "os" ) func main() { //系統(tǒng)打開文件并賦予文件實體 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 { //手動宕機處理,立馬關(guān)閉當前程序,并釋放內(nèi)存空間 panic("程序宕機") //閾值 } } } func main() { hello() }
2. 讀取文件
接收一個字節(jié)切片,返回讀取的字節(jié)數(shù)和可能的具體錯誤,讀到文件末尾時會返回0
和 io.EOF
func (f *File) Read(b []byte) (n int,err error)
2.1 defer 語句
示例:
defer
—般用于資源的釋放和異常的捕捉。;
defer
語句會將其后面跟隨的語句進行延遲處理
;跟在defer
后面的語言將會在程序進行最后的return
之后再執(zhí)行
在defer
歸屬的函數(shù)即將返回時,將延遲處理的語句按defer
的逆序進行執(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 手動宕機處理
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 { //手動宕機處理,立馬關(guān)閉當前程序,并釋放內(nèi)存空間 panic("程序宕機") } } } 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[:]) //以切片的形式讀取 //文件讀取完成,進行判斷 if err == io.EOF { fmt.Println("文件讀取完畢", err) return } //讀取過程中出現(xiàn)異常 if err != nil { fmt.Println("文件讀取失敗", err) return } fmt.Printf("字節(jié)數(shù): %d 個\n", n) fmt.Printf("獲取的內(nèi)容是: %s", string(result[:])) }
2.4 bufio 讀取文件
使用bufio讀取,bufio 在 file 的基礎上封裝了一層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) //計數(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("請輸入用戶名:") 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ū) //計數(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("文件讀取錯誤") return } if a%2 == 1 { if name == string(str) { fmt.Println("登錄成功") return } } } }
3. 寫入文件
3.1 os.OpenFile() 函數(shù)
os.OpenFile()
函數(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)限,一個八進制數(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語言學習之文件操作方法詳解的詳細內(nèi)容,更多關(guān)于Go語言文件操作的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go-cqhttp權(quán)限管理系統(tǒng)的實現(xiàn)代碼
這篇文章主要介紹了go-cqhttp權(quán)限管理,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09Prometheus Go client library使用方式詳解
這篇文章主要為大家介紹了Prometheus Go client library使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系解析
這篇文章主要為大家介紹了Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12