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

Go語言文件開關(guān)及讀寫操作示例

 更新時間:2022年08月01日 14:25:34   作者:夢想橡皮擦  
這篇文章主要為大家介紹了Go語言文件開關(guān)及讀寫操作的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

?? 實(shí)戰(zhàn)場景

本篇博客為大家再次帶來 Go 語言的基礎(chǔ)知識,這次要學(xué)習(xí)的內(nèi)容是 Go 中的文件操作。

打開關(guān)閉文件

在 Go 中操作文件,首先要做的就是導(dǎo)入 os 模塊,該模塊中具備相關(guān)函數(shù)定義。

package main
import (
	"fmt"
	"os"
)
func main() {
	// 打開文件
	file, err := os.Open("./ca.txt")
	if err != nil {
		fmt.Println("文件打開失敗", err)
		return
	}
	print(file) // 輸出地址 0xc000006028
	// 關(guān)閉文件
	file.Close()
}

如果文件打開失敗,直接展示錯誤信息,正確的話,會返回 file 對象的地址。

讀取文件

使用 Read 函數(shù)讀取文件,其定義如下所示:

func (f *File) Read(b [] byte)(n int,err error)

從定義中可以發(fā)現(xiàn),Read 函數(shù)會返回 2 個值,第一個是讀取的字節(jié)數(shù),第二個是當(dāng)讀取報(bào)錯時,返回錯誤信息,示例代碼如下所示:

package main
import (
	"fmt"
	"io"
	"os"
)
func main() {
	// 打開文件
	file, err := os.Open("./ca.txt")
	if err != nil {
		fmt.Println("打開文件失敗,錯誤信息:", err)
		return
	}
	// 為了防止忘記關(guān)閉文件,可使用defer注冊文件關(guān)閉語句
	defer file.Close()
	// Read方法讀取數(shù)據(jù)
	var tmp = make([]byte, 128)
	// 讀取文件
	n, err := file.Read(tmp)
	// 碰到 io.EOF 表示文件讀取到末尾
	if err == io.EOF {
		fmt.Println("文件讀取完畢")
		return
	}
	if err != nil {
		fmt.Println("讀取文件失敗,錯誤信息:", err)
		return
	}
	fmt.Printf("讀取了 %d 字節(jié)數(shù)據(jù)\n", n)
	fmt.Println(string(tmp[:n]))
}

輸出如下內(nèi)容:

讀取了 24 字節(jié)數(shù)據(jù)
姓名:夢想橡皮擦

讀取到 24 個字節(jié),標(biāo)準(zhǔn)的中文占 3 個字節(jié)。

但是上述代碼最大的問題就是,我們給變量 tmp,即數(shù)組 tmp 僅設(shè)置了 128 字節(jié),如果待讀取的文件超過了改值,例如 txt 內(nèi)容如下所示:

姓名:夢想橡皮擦1
姓名:夢想橡皮擦2
姓名:夢想橡皮擦3
姓名:夢想橡皮擦4
姓名:夢想橡皮擦5

此時運(yùn)行代碼,就會發(fā)現(xiàn) Read 函數(shù)讀取到第 128 個字節(jié)的時候,就會停止讀取,間接導(dǎo)致讀取到的數(shù)據(jù)亂碼。

讀取了 128 字節(jié)數(shù)據(jù)
姓名:夢想橡皮擦1
姓名:夢想橡皮擦2
姓名:夢想橡皮擦3
姓名:夢想橡皮擦4
姓名:夢想橡??

解決該問題,需要用到 for 循環(huán)讀取文件數(shù)據(jù),代碼如下:

package main
import (
	"fmt"
	"io"
	"os"
)
func main() {
	// 打開文件
	file, err := os.Open("./ca.txt")
	if err != nil {
		fmt.Println("打開文件失敗,錯誤信息:", err)
		return
	}
	defer file.Close()
	// 聲明一個 content 切片
	var content []byte
	var tmp = make([]byte, 128)
	for {
		n, err := file.Read(tmp)
		if err == io.EOF {
			fmt.Println("文件讀取完畢")
			break
		}
		if err != nil {
			fmt.Println("讀取文件失敗,錯誤信息:", err)
			return
		}
		// 追加數(shù)據(jù)
		content = append(content, tmp[:n]...)
	}
	fmt.Println(string(content))
}

上述代碼聲明了一個動態(tài)數(shù)組,即切片,解決了讀取數(shù)據(jù)不足的問題。

bufio 讀取文件

該函數(shù)可以一次讀取一行數(shù)據(jù),示例代碼如下:

func main() {
	file, err := os.Open("./ca.txt")
	if err != nil {
		fmt.Println("打開文件失敗,錯誤信息:", err)
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file)
	for {
		// 逐行讀取數(shù)據(jù)
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			if len(line) != 0 {
				fmt.Println(line)
			}
			fmt.Println("文件讀取完畢")
			break
		}
		if err != nil {
			fmt.Println("讀取文件失敗,錯誤信息:", err)
			return
		}
		fmt.Print(line)
	}
}

該函數(shù)與 Python 中的 readline 具備同樣的效果,接下來演示一下讀取整個文件,代碼如下:

package main
import (
	"fmt"
	"io/ioutil"
)
func main() {
	content, err := ioutil.ReadFile("./ca.txt")
	if err != nil {
		fmt.Println("打開文件失敗,錯誤信息:", err)
		return
	}
	fmt.Println(string(content))
}

注意導(dǎo)入模塊的時候,直接導(dǎo)入了 io 包中的 ioutil 函數(shù)。

寫文件

使用 os.OpenFile() 函數(shù)可以指定模式打開文件,即可以寫入的方式打開文件。

寫入文件最常用的函數(shù)是 WriteWriteString,示例代碼如下所示:

package main
import (
	"fmt"
	"os"
)
func main() {
	file, err := os.OpenFile("ca.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println("打開文件失敗,錯誤信息:", err)
		return
	}
	defer file.Close()
	name := "橡皮擦"
	file.Write([]byte(name))  //寫入字節(jié)切片
	file.WriteString("夢想橡皮擦") //寫入字符串
}

使用該方式寫入文件,會覆蓋之前的文件內(nèi)容,查看結(jié)果可直接打開目錄下的 ca.txt 進(jìn)行查看。

我們將 os.OpenFile("ca.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) 中的參數(shù)進(jìn)行單獨(dú)的說明。

第一個參數(shù)表示文件名,第二個參數(shù)是打開文件的模式,具體模式如下所示:

os.O_WRONLY:只寫;

os.O_CREATE:創(chuàng)建文件;

os.O_RDONLY:只讀;

os.O_RDWR:讀寫;

os.O_TRUNC:清空;

os.O_APPEND:追加。

可以看到與 Python 中的文件模式基本一致。

最后一個參數(shù)值 0666 表示文件權(quán)限(八進(jìn)制),這與 linux 文件權(quán)限數(shù)字一致,讀 r 等于 4(感謝博友指出該錯誤),寫 w 表示 2,執(zhí)行 x 等于 1,所以 666 表示的是文件可讀,可寫。

在文件寫入部分,還存在 bufio.NewWriter 整行寫入,ioutil.WriteFile 整體寫入等內(nèi)容,可以學(xué)習(xí)的時候重點(diǎn)查閱一下。

以上就是Go語言文件開關(guān)及讀寫操作示例的詳細(xì)內(nèi)容,更多關(guān)于Go文件開關(guān)讀寫操作的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang字符串類型原理及其使用方法

    Golang字符串類型原理及其使用方法

    本文主要介紹了Golang字符串類型原理及其使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 詳解Golang如何在編譯時注入版本信息

    詳解Golang如何在編譯時注入版本信息

    這篇文章主要為大家詳細(xì)介紹了Golang如何在編譯時實(shí)現(xiàn)注入版本信息,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-06-06
  • Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法分析

    Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法分析

    這篇文章主要介紹了Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法,結(jié)合實(shí)例形式分析了Go語言數(shù)組排序相關(guān)算法原理與操作技巧,需要的朋友可以參考下
    2017-02-02
  • Golang中對json的優(yōu)雅處理方式

    Golang中對json的優(yōu)雅處理方式

    這篇文章主要給大家介紹了關(guān)于Golang中對json的優(yōu)雅處理方式,解析JSON在golang中很麻煩,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Go語言中循環(huán)Loop的用法介紹

    Go語言中循環(huán)Loop的用法介紹

    這篇文章介紹了Go語言中循環(huán)Loop的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go使用proto3的踩坑實(shí)戰(zhàn)記錄

    Go使用proto3的踩坑實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于Go使用proto3的踩坑記錄,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者會用Go語言具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-02-02
  • Golang檢查變量類型的四種方式

    Golang檢查變量類型的四種方式

    Go提供幾種方法檢查變量的類型,在字符串格式化標(biāo)識%T, 反射方式:reflect.TypeOf, reflect.ValueOf.Kind,另外還有使用類型斷言,switch case方式,下面通過實(shí)例分別介紹這四類方法,需要的朋友可以參考下
    2022-10-10
  • 使用golang寫一個redis-cli的方法示例

    使用golang寫一個redis-cli的方法示例

    這篇文章主要介紹了使用golang寫一個redis-cli的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 手把手帶你走進(jìn)Go語言之循環(huán)語句

    手把手帶你走進(jìn)Go語言之循環(huán)語句

    在不少實(shí)際問題中有許多具有規(guī)律性的重復(fù)操作,因此在程序中就需要重復(fù)執(zhí)行某些語句。一組被重復(fù)執(zhí)行的語句稱之為循環(huán)體,能否繼續(xù)重復(fù),決定循環(huán)的終止條件,本文給大家介紹的非常詳細(xì),跟著小編往下看吧
    2021-09-09
  • 如何避免Go語言常見錯誤之意外的變量隱藏

    如何避免Go語言常見錯誤之意外的變量隱藏

    在Go語言中,變量隱藏(Variable Shadowing)是一個常見的錯誤來源,變量隱藏發(fā)生在一個內(nèi)部作用域中聲明的變量與外部作用域的變量同名時,這可能導(dǎo)致開發(fā)者無意中使用了錯誤的變量,造成難以追蹤的bug,本文講解一些關(guān)于變量隱藏的常見錯誤和如何避免它們的方法
    2024-01-01

最新評論

东乡族自治县| 盘山县| 峨眉山市| 唐山市| 塔城市| 扎赉特旗| 江都市| 盈江县| 高州市| 诸城市| 利辛县| 扎兰屯市| 黎川县| 乐业县| 东城区| 绥中县| 原平市| 阿勒泰市| 工布江达县| 兰州市| 蕉岭县| 马尔康县| 遂溪县| 山西省| 澄江县| 巫山县| 伊金霍洛旗| 茂名市| 永川市| 安远县| 永兴县| 东辽县| 全州县| 吴忠市| 义乌市| 观塘区| 衡水市| 太仓市| 辉南县| 静宁县| 象州县|