最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言學(xué)習(xí)之文件操作方法詳解

 更新時(shí)間:2022年04月21日 14:13:38   作者:隱姓埋名4869  
這篇文章主要為大家詳細(xì)介紹了Go語言中一些常見的文件操作,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下

引言

計(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如何讀取單行超長的文本詳解

    Golang如何讀取單行超長的文本詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何讀取單行超長文本的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Go設(shè)計(jì)模式之觀察者模式圖解

    Go設(shè)計(jì)模式之觀察者模式圖解

    觀察者模式是一種行為設(shè)計(jì)模式, 允許你定義一種訂閱機(jī)制, 可在對(duì)象事件發(fā)生時(shí)通知多個(gè) “觀察” 該對(duì)象的其他對(duì)象,下面這篇文章主要給大家介紹了關(guān)于圖解Go觀察者模式的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Golang中的Unicode與字符串示例詳解

    Golang中的Unicode與字符串示例詳解

    這篇文章主要給大家介紹了關(guān)于Golang中Unicode與字符串的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Golang將Map的鍵值對(duì)調(diào)的實(shí)現(xiàn)示例

    Golang將Map的鍵值對(duì)調(diào)的實(shí)現(xiàn)示例

    本文主要介紹了Golang將Map的鍵值對(duì)調(diào)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Golang?Time包與日期函數(shù)的用法詳解

    Golang?Time包與日期函數(shù)的用法詳解

    在golang中,time包提供了時(shí)間的顯示和測(cè)量用的函數(shù),下面小編就來和大家詳細(xì)聊聊Golang中Time包與日期函數(shù)的具體用法,快跟隨小編一起學(xué)習(xí)一下吧
    2023-07-07
  • go module使用本地包的方法示例

    go module使用本地包的方法示例

    這篇文章主要介紹了go module使用本地包的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Go語言Grpc?Stream的實(shí)現(xiàn)

    Go語言Grpc?Stream的實(shí)現(xiàn)

    本文主要介紹了Go語言Grpc?Stream的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • go語言程序cpu過高問題排查的方法詳解

    go語言程序cpu過高問題排查的方法詳解

    使用golang進(jìn)行復(fù)雜的組合運(yùn)算,導(dǎo)致CPU占用率非常高,下面這篇文章主要給大家介紹了關(guān)于go語言程序cpu過高問題排查的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 詳解golang?defer?閉包?匿名函數(shù)

    詳解golang?defer?閉包?匿名函數(shù)

    這篇文章主要介紹了golang?defer?閉包?匿名函數(shù)的相關(guān)知識(shí),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • golang切片內(nèi)存應(yīng)用技巧詳解

    golang切片內(nèi)存應(yīng)用技巧詳解

    這篇文章主要介紹了golang切片內(nèi)存應(yīng)用技巧詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

新昌县| 凌云县| 渭南市| 珠海市| 西畴县| 长岭县| 紫金县| 衡南县| 陵水| 霍林郭勒市| 黎川县| 平顶山市| 锡林浩特市| 南通市| 龙海市| 全椒县| 朝阳县| 徐水县| 南丹县| 商城县| 崇礼县| 桑日县| 邵武市| 慈溪市| 太白县| 秭归县| 北川| 商洛市| 昆明市| 磐安县| 元谋县| 泸定县| 新巴尔虎右旗| 来凤县| 武威市| 临湘市| 临猗县| 濮阳市| 繁峙县| 惠州市| 岐山县|