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

Go讀取文件與寫入文件的三種方法操作指南

 更新時間:2022年09月16日 11:57:19   作者:心鴿  
在 Go 語言中也經(jīng)常會遇到操作文件的需求,下面這篇文章主要給大家介紹了關(guān)于Go讀取文件與寫入文件的三種方法操作,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

打開和關(guān)閉文件操作:

os.Open()函數(shù)能夠打開一個文件,返回一個*File和一個err。對得到的文件實(shí)例調(diào)用close()方法能夠關(guān)閉文件。

package main
import (
    "fmt"
    "os"
)
//文件操作
func main(){
    //打開文件
    file, err := os.Open("./test.txt") //只是用來讀的時候,用os.Open。相對路徑,針對于同目錄下。
    if err != nil{
        fmt.Printf("打開文件失敗,err:%v\n",err)
        return
    }
    defer file.Close() //關(guān)閉文件,為了避免文件泄露和忘記寫關(guān)閉文件
}

打開文件讀取內(nèi)容并關(guān)閉文件:

package main

import (
    "fmt"
    "os"
)
//文件操作
func main(){
    //打開文件
    file, err := os.Open("./test.txt") //只是用來讀的時候,用os.Open。相對路徑,針對于同目錄下。
    if err != nil{
        fmt.Printf("打開文件失敗,err:%v\n",err)
        return
    }
    defer file.Close() //關(guān)閉文件,為了避免文件泄露和忘記寫關(guān)閉文件
    //讀取文件內(nèi)容
    var qiepian = make([]byte,128) //做一個大小為128字節(jié)的切片
    n, err := file.Read(qiepian) //file.Read里面是一個切片.如果讀取成功,那么值聲明變量n并同時賦值給n。
    //判斷
    if err != nil{ //if err != nil 意思是如果err不為空,那么就說明err有錯誤值,打印讀取錯誤。如果為空,說明err沒有錯誤值,打印讀取成功
        fmt.Printf("讀取文件錯誤,錯誤值為:%v\n",err)
        return
    }
    fmt.Printf("讀取文件成功,文件字節(jié)大小為:%d\n",n)
    fmt.Println(string(qiepian))
}

但是如果文件的字節(jié)大小大于128呢?

如果文件有1W個字節(jié),但是我們設(shè)置的一次只能讀取128個,怎么樣才能全部讀取文件內(nèi)容?

用循環(huán)讀取,一次讀128,直到讀完。

func readall(){
    //打開文件
    file, err := os.Open("./test.txt") //只是用來讀的時候,用os.Open。相對路徑,針對于同目錄下。
    if err != nil{
        fmt.Printf("打開文件失敗,err:%v\n",err)
        return
    }
    defer file.Close() //關(guān)閉文件,為了避免文件泄露和忘記寫關(guān)閉文件
    
    //讀取文件內(nèi)容
    for {
        var qiepian = make([]byte,128) //做一個大小為128字節(jié)的切片
        n, err := file.Read(qiepian) //file.Read里面是一個切片.如果讀取成功,那么值聲明變量n并同時賦值給n。
        if err == io.EOF{ //EOF表示 end of file,就是文件的末尾,這個判斷意思就是,讀到文件末尾的時候,將當(dāng)前讀了多少字節(jié)打印出來并退出
            //把當(dāng)前讀了多少字節(jié)的數(shù)據(jù)打印出來,然后退出
            fmt.Println(string(qiepian))
            return
        }
        //判斷
        if err != nil{ //if err != nil 意思是如果err不為空,那么就說明err有錯誤值,打印讀取錯誤。如果為空,說明err沒有錯誤值,打印讀取成功
            fmt.Printf("讀取文件錯誤,錯誤值為:%v\n",err)
            return
        }
        fmt.Printf("讀取文件成功,文件字節(jié)大小為:%d\n",n)
        fmt.Println(string(qiepian[:n]))
    }
}
func main(){
    readall()
}

但是這樣寫,有點(diǎn)太麻煩。

基于此,使用go語言中的內(nèi)置包,buffio和ioutil來讀取

buffio操作:

是在file基礎(chǔ)上封裝了一層IP。

先把磁盤的內(nèi)容讀到緩沖區(qū),然后再讀到代碼中去。

寫入是先將寫入的內(nèi)容寫到緩沖區(qū),然后再寫到磁盤中去。

func readBybuffio(){
    //打開文件
    file, err := os.Open("./test.txt") //只是用來讀的時候,用os.Open。相對路徑,針對于同目錄下。
    if err != nil{
        fmt.Printf("打開文件失敗,err:%v\n",err)
        return
    }
    defer file.Close() //關(guān)閉文件,為了避免文件泄露和忘記寫關(guān)閉文件

    //使用buffio讀取文件內(nèi)容
    reader := bufio.NewReader(file) //創(chuàng)建新的讀的對象
    for {
        line , err := reader.ReadString('\n') //注意是字符,換行符。
        if err == io.EOF{ 
            fmt.Println("文件讀完了")
            break
        }
        if err != nil{ //錯誤處理
            fmt.Printf("讀取文件失敗,錯誤為:%v",err)
            return
        }
        fmt.Println(line)
    }   
}

func main(){
    readBybuffio()
}

ioutil讀取整個文件:

//ioutuil
func readByioutil(){
    iot,err := ioutil.ReadFile("./test.txt") //讀取文件
    if err != nil{ //做錯誤判斷
        fmt.Printf("讀取文件錯誤,錯誤為:%v\n",err)
        return
    }
    fmt.Println(string(iot)) //打印文件內(nèi)容
}

所以我們可以得知,go語言中讀取文件的三種方法。

第一種,我們可以使用切片的形式,定制一次讀取文件的多少字節(jié)并用for循環(huán)來讀取文件的內(nèi)容。

第二種,我們可以使用go語言內(nèi)置的buffio包來一行一行的讀取文件的內(nèi)容。

第三種,我們可以使用go語言內(nèi)置的ioutil包來讀取整個文件的所有內(nèi)容。

文件寫入操作

os.OpenFile()函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。

Write和WriteString寫入操作

package main

import (
    "fmt"
    "os"
)

//文件寫入
func write(){
    //os.O_CREATE:創(chuàng)建
    //os.O_WRONLY:只寫
    //os.O_APPEND:追加
    //os.O_RDONLY:只讀
    //os.O_RDWR:讀寫
    //os.O_TRUNC:清空

    //0644:文件的權(quán)限
    //如果沒有test.txt這個文件那么就創(chuàng)建,并且對這個文件只進(jìn)行寫和追加內(nèi)容。
    file,err := os.OpenFile("./test.txt",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)
    if err != nil{
        fmt.Printf("文件錯誤,錯誤為:%v\n",err)
        return
    }
    defer file.Close()
    str := "你好啊\n"
    file.Write([]byte(str)) //將str字符串的內(nèi)容寫到文件中,強(qiáng)制轉(zhuǎn)換為byte,因?yàn)閃rite接收的是byte。
    file.WriteString("Hello") //寫字符串
}
func main(){
    write()
}

使用buffio內(nèi)置包來讀文件

bufio.NewWriter: 先往緩沖區(qū)寫,然后才寫到磁盤中去。

func buffiowrite(){
    file,err := os.OpenFile("./gch.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
    if err != nil{
        fmt.Printf("打開文件失敗,錯誤為:%v\n",err)
        return
    }
    defer file.Close() //關(guān)閉文件
    
    writer := bufio.NewWriter(file) //往文件里面寫入內(nèi)容,得到了一個writer對象
    for i := 0; i <10; i++ { //循環(huán)寫入10行
        writer.WriteString("test\n") //將數(shù)據(jù)寫入緩存
    }
    writer.Flush() //將緩存中內(nèi)容的寫入文件
}

第三種寫入文件方法:ioutil.WriteFile

func ioutilWrite(){
    str := "Hello Golang!"
    err := ioutil.WriteFile("./ioutil.txt",[]byte(str),0664)//接收文件名,字節(jié)類型的數(shù)據(jù),文件的權(quán)限
    if err != nil{
        fmt.Printf("打開文件失敗,錯誤為:%v\n",err)
        return
    }
}

總結(jié)

到此這篇關(guān)于Go讀取文件與寫入文件的三種方法操作的文章就介紹到這了,更多相關(guān)Go讀取文件與寫入文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入了解Golang中占位符的使用

    深入了解Golang中占位符的使用

    在寫?golang?的時候,也是有對應(yīng)的格式控制符,也叫做占位符,寫這個占位符,需要有對應(yīng)的數(shù)據(jù)與之對應(yīng),不能瞎搞。本文就來和大家聊聊Golang中占位符的使用,希望對大家有所幫助
    2023-03-03
  • go?打包運(yùn)行文件在windows,liunx運(yùn)行

    go?打包運(yùn)行文件在windows,liunx運(yùn)行

    這篇文章主要介紹了go?打包運(yùn)行文件在windows,liunx運(yùn)行的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Go+Redis緩存設(shè)計與優(yōu)化實(shí)現(xiàn)

    Go+Redis緩存設(shè)計與優(yōu)化實(shí)現(xiàn)

    本文主要介紹了Go+Redis緩存設(shè)計與優(yōu)化實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Go并發(fā)編程sync.Cond的具體使用

    Go并發(fā)編程sync.Cond的具體使用

    Go 標(biāo)準(zhǔn)庫提供 Cond 原語的目的是,為等待 / 通知場景下的并發(fā)問題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05
  • Go路由注冊方法詳解

    Go路由注冊方法詳解

    Go語言中,http.NewServeMux()和http.HandleFunc()是兩種不同的路由注冊方式,前者創(chuàng)建獨(dú)立的ServeMux實(shí)例,適合模塊化和分層路由,靈活性高,但啟動服務(wù)器時需要顯式指定,后者使用全局默認(rèn)的http.DefaultServeMux,適合簡單場景,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • 使用Golang實(shí)現(xiàn)對網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與分析

    使用Golang實(shí)現(xiàn)對網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與分析

    在網(wǎng)絡(luò)通信中,網(wǎng)絡(luò)數(shù)據(jù)包是信息傳遞的基本單位,抓包是一種監(jiān)控和分析網(wǎng)絡(luò)流量的方法,用于獲取網(wǎng)絡(luò)數(shù)據(jù)包并對其進(jìn)行分析,本文將介紹如何使用Golang實(shí)現(xiàn)抓包功能,包括網(wǎng)絡(luò)數(shù)據(jù)包捕獲和數(shù)據(jù)包分析,需要的朋友可以參考下
    2023-11-11
  • Go Println和Printf的區(qū)別詳解

    Go Println和Printf的區(qū)別詳解

    這篇文章主要介紹了Go Println和Printf的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang?pprof監(jiān)控memory?block?mutex使用指南

    golang?pprof監(jiān)控memory?block?mutex使用指南

    這篇文章主要為大家介紹了golang?pprof監(jiān)控memory?block?mutex使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Golang?WorkerPool線程池并發(fā)模式示例詳解

    Golang?WorkerPool線程池并發(fā)模式示例詳解

    這篇文章主要為大家介紹了Golang?WorkerPool線程池并發(fā)模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 總結(jié)Go語言中defer的使用和注意要點(diǎn)

    總結(jié)Go語言中defer的使用和注意要點(diǎn)

    Go語言中的defer關(guān)鍵字實(shí)現(xiàn)比較特殊的功能,這篇文章給大家總結(jié)了關(guān)于Go語言中defer的使用和注意要點(diǎn),有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-09-09

最新評論

柘荣县| 阳西县| 永丰县| 北京市| 宽甸| 乌兰县| 施秉县| 原阳县| 沅陵县| 刚察县| 长治市| 偃师市| 茶陵县| 磐石市| 静宁县| 长泰县| 永和县| 兴安县| 祁东县| 舒城县| 土默特左旗| 安西县| 明星| 谷城县| 抚州市| 监利县| 兖州市| 闸北区| 太白县| 天津市| 修武县| 丰城市| 松潘县| 正定县| 甘洛县| 高台县| 射洪县| 营口市| 泊头市| 新疆| 峨眉山市|