欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言學習之文件操作方法詳解

 更新時間:2022年04月21日 14:13:38   作者:隱姓埋名4869  
這篇文章主要為大家詳細介紹了Go語言中一些常見的文件操作,文中的示例代碼講解詳細,對我們學習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)文章

  • 詳解如何在Golang中監(jiān)聽多個channel

    詳解如何在Golang中監(jiān)聽多個channel

    這篇文章主要為大家詳細介紹了如何在Golang中實現(xiàn)監(jiān)聽多個channel,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • go-cqhttp權(quán)限管理系統(tǒng)的實現(xiàn)代碼

    go-cqhttp權(quán)限管理系統(tǒng)的實現(xiàn)代碼

    這篇文章主要介紹了go-cqhttp權(quán)限管理,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 深入了解Go語言中的作用域和變量重聲明

    深入了解Go語言中的作用域和變量重聲明

    在?Go?語言中,代碼塊的嵌套和作用域是程序設計的關(guān)鍵概念之一,本文將探討如何在?Go?語言中利用代碼塊的嵌套和作用域來組織代碼,并介紹變量重聲明的規(guī)則,感興趣的可以了解下
    2023-11-11
  • go語言base64加密解密的方法

    go語言base64加密解密的方法

    這篇文章主要介紹了go語言base64加密解密的方法,實例分析了Go語言base64加密解密的技巧,需要的朋友可以參考下
    2015-03-03
  • Prometheus Go client library使用方式詳解

    Prometheus Go client library使用方式詳解

    這篇文章主要為大家介紹了Prometheus Go client library使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 解決golang http.FileServer 遇到的坑

    解決golang http.FileServer 遇到的坑

    這篇文章主要介紹了解決golang http.FileServer 遇到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Gin框架自帶參數(shù)校驗的使用詳解

    Gin框架自帶參數(shù)校驗的使用詳解

    這篇文章主要為大家詳細介紹了如何使用Gin框架自帶的參數(shù)校驗,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解下
    2023-09-09
  • Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系解析

    Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系解析

    這篇文章主要為大家介紹了Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • GO語言ini配置文件的讀取的操作

    GO語言ini配置文件的讀取的操作

    這篇文章主要介紹了GO語言ini配置文件的讀取的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go中recover與panic區(qū)別詳解

    Go中recover與panic區(qū)別詳解

    這篇文章主要介紹了Go中recover與panic區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11

最新評論