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

一文帶你掌握Go語言中文件的寫入操作

 更新時間:2022年12月07日 08:18:59   作者:陳明勇  
這篇文章主要和大家分享一下Go語言中文件的寫入操作,文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定的幫助,需要的小伙伴可以參考一下

前言

上篇文章 一文掌握 Go 文件的讀取操作 介紹了如何使用 Go os 包和 bufio 包里的幾個函數(shù)和方法,通過案例展示如何讀取文件里的內(nèi)容。本文接著上篇文章的內(nèi)容,介紹文件的寫入操作。

File.Write、File.WriteString、File.WriteAt

File.Write(b []byte) (n int, err error)

直接操作磁盤往文件里寫入數(shù)據(jù),寫入單位為字節(jié)。

  • b 參數(shù):寫入的數(shù)據(jù),類型為字節(jié)切片。
  • 返回值 n:寫入的字節(jié)數(shù)。
  • 返回值 err:寫入數(shù)據(jù)的過程中產(chǎn)生的錯誤。

File.WriteString(s string) (n int, err error)

直接操作磁盤往指定文件里寫入數(shù)據(jù),寫入單位為字符串。

  • s 參數(shù):寫入的字符串?dāng)?shù)據(jù)。
  • 返回值 n:寫入的字節(jié)數(shù)。
  • 返回值 err:寫入數(shù)據(jù)的過程中產(chǎn)生的錯誤。

File.WriteAt(b []byte, off int64) (n int, err error)

從指定位置 off 往文件里順序?qū)懭霐?shù)據(jù),如果某個偏移量上有數(shù)據(jù),則會覆蓋。

  • b 參數(shù):寫入的數(shù)據(jù),類型為字節(jié)切片。
  • off 參數(shù):偏移量,從此位置開始寫入數(shù)據(jù)。
  • 返回值 n:寫入的字節(jié)數(shù)。
  • 返回值 err:寫入數(shù)據(jù)的過程中產(chǎn)生的錯誤。

文件寫入操作

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.OpenFile("test.txt", os.O_CREATE, 0)
    if err != nil {
            fmt.Println(err)
            return
    }
    defer file.Close()
    count, err := file.Write([]byte{'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\n'})
    if err != nil {
            return
    }
    fmt.Printf("寫入了 %d 字節(jié)\n", count)
    count, err = file.WriteString("Hello Golang")
    if err != nil {
            return
    }
    fmt.Printf("寫入了長度為 %d 的字符串\n", count)
    count, err = file.WriteAt([]byte{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, 0)
    if err != nil {
            return
    }
    fmt.Printf("寫入了 %d 字節(jié)\n", count)
}

首先打開 test.txt 文件,指定的模式為 os.O_CREATE,如果文件不存在則會自動創(chuàng)建;

然后通過 Write 方法以字符的形式往文件里寫入 Hello World\n 的內(nèi)容;

接著通過 WriteString 方法以字符串的形式往文件里寫入 Hello Golang 內(nèi)容;此時文件里的內(nèi)容如下所示:

Hello World
Hello Golang

最后通過 WriteAt 方法,指定從偏移量為 0 的位置開始寫入數(shù)據(jù) xxxxxxxxxxx,由于 0 以及之后位置都有數(shù)據(jù),因此原有數(shù)據(jù)被覆蓋了。最后文件的內(nèi)容為:

xxxxxxxxxxx
Hello Golang

File.Seek

File.Seek(offset int64, whence int)

相對于開頭位置或當(dāng)前位置或末尾位置,將設(shè)置當(dāng)前讀或?qū)懙钠屏吭O(shè)置為 offset。

  • offset 參數(shù):所要設(shè)置的偏移量。
  • whence:相對于哪個位置開始設(shè)置偏移量的標(biāo)志,可選值為 0 → 開頭位置,1 → 當(dāng)前位置,2 → 末尾位置。

應(yīng)用

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.OpenFile("test.txt", os.O_CREATE, 0)
    if err != nil {
            fmt.Println(err)
            return
    }
    defer file.Close()
    _, err = file.WriteString("G0lang")
    if err != nil {
            return
    }
    _, err = file.Seek(1, 0)
    if err != nil {
            fmt.Println(err)
            return
    }
    _, err = file.Write([]byte{'o'})
    if err != nil {
            fmt.Println(err)
            return
    }
}
  • 打開 test.txt 文件,指定的模式為 os.O_CREATE,如果文件不存在則會自動創(chuàng)建;
  • 使用 WriteString 方法往文件里寫入 G0lang 字符串;
  • 此時發(fā)現(xiàn)第二個字符錯了,0 應(yīng)該改成 o;此時的偏移量是指向尾部的;使用 Seek 方法將偏移量移到第二個位置,然后寫入字符 o,由于當(dāng)前位置已有數(shù)據(jù) 0,因此 o 將會覆蓋 0

bufio.NewWriter、Writer.WriteString、Writer.Flush

如果需要多次執(zhí)行寫入文件的操作,推薦使用 bufio 里的 Writer 結(jié)構(gòu)體去操作,它會開辟一個緩沖區(qū),默認大小為 4096 字節(jié)。在數(shù)據(jù)沒有被刷入磁盤之前,所寫入的數(shù)據(jù)都會暫時保存到緩沖區(qū)里。

NewWriter(w io.Writer) *Writer

開辟一個默認值為 4096 字節(jié)的緩沖區(qū),用于暫存寫入文件的數(shù)據(jù)內(nèi)容,返回一個 Writer 結(jié)構(gòu)體的指針變量

  • w 參數(shù):類型為 Writer 接口,實現(xiàn)這個接口的數(shù)據(jù)類型變量都可以作為參數(shù),例如 File。
  • 返回值 *Writer:一個 Writer 結(jié)構(gòu)體的指針變量,通過該變量可以往緩沖區(qū)里寫入數(shù)據(jù)。

Writer.WriteString(s string) (int, error)

往緩沖區(qū)寫入內(nèi)容的方法。

  • 參數(shù) s 為寫入的字符串。
  • 第一個返回值為寫入的字節(jié)數(shù)。
  • 第二個返回值為寫入數(shù)據(jù)的過程中產(chǎn)生的錯誤。

Writer.Flush() error

將所有的緩存數(shù)據(jù)寫入磁盤。

返回值為數(shù)據(jù)寫入磁盤的過程中產(chǎn)生的錯誤。

文件寫入操作

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    file, err := os.OpenFile("test.txt", os.O_CREATE, 0)
    if err != nil {
            fmt.Println(err)
            return
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    _, err = writer.WriteString("Hello World\n")
    if err != nil {
            fmt.Println(err)
            return
    }
    _, err = writer.WriteString("Hello Golang\n")
    if err != nil {
            fmt.Println(err)
            return
    }
    _, err = writer.WriteString("Hello Gopher\n")
    if err != nil {
            fmt.Println(err)
            return
    }
    writer.Flush()
}
  • 首先打開 test.txt 文件,指定的模式為 os.O_CREATE,如果文件不存在則會自動創(chuàng)建;
  • 然后使用 NewWriter 函數(shù)獲取一個 Writer 結(jié)構(gòu)體的指針變量 writer
  • 接著通過 writerWriteString 方法將內(nèi)容保存到緩沖區(qū)里;
  • 最后調(diào)用 Flush 方法,將所有的緩存數(shù)據(jù)寫入磁盤。

小結(jié)

本文先是對 File.Write、File.WriteString、File.WriteAt 進行介紹,通過例子演示它們的使用方式;然后介紹 File.Seek,說明了它的用法;最后引出 bufio.NewWriterWriter.WriteString、Writer.Flush,使用它們代替 File 結(jié)構(gòu)體里的寫入方法,可以不用頻繁操作磁盤,提高寫入效率。

到此這篇關(guān)于一文帶你掌握Go語言中文件的寫入操作的文章就介紹到這了,更多相關(guān)Go語言文件寫入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言實現(xiàn)超時的三種方法實例

    Go語言實現(xiàn)超時的三種方法實例

    超時在一些業(yè)務(wù)場景里非常普遍,下面這篇文章主要給大家介紹了關(guān)于Go語言實現(xiàn)超時的三種方法,文中通過實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Go語言具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-07-07
  • Golang channel死鎖的幾種情況小結(jié)

    Golang channel死鎖的幾種情況小結(jié)

    本文主要介紹了Golang channel死鎖的幾種情況小結(jié),詳細的介紹了六種情況,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • go本地環(huán)境配置及vscode go插件安裝的詳細教程

    go本地環(huán)境配置及vscode go插件安裝的詳細教程

    這篇文章主要介紹了go本地環(huán)境配置及vscode go插件安裝的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • go語言string轉(zhuǎn)結(jié)構(gòu)體的實現(xiàn)

    go語言string轉(zhuǎn)結(jié)構(gòu)體的實現(xiàn)

    本文主要介紹了go語言string轉(zhuǎn)結(jié)構(gòu)體的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • go語言的panic和recover函數(shù)用法實例

    go語言的panic和recover函數(shù)用法實例

    今天小編就為大家分享一篇關(guān)于go語言的panic和recover函數(shù)用法實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Go秒爬博客園100頁新聞

    Go秒爬博客園100頁新聞

    利用go語言的協(xié)程并發(fā)優(yōu)勢爬取網(wǎng)頁速度相當(dāng)之快,博客園100頁新聞標(biāo)題只需一秒即可全部爬取,跟著小編一起去看看如何實現(xiàn)的,希望大家可以從中受益
    2018-09-09
  • Golang?實現(xiàn)Redis?協(xié)議解析器的解決方案

    Golang?實現(xiàn)Redis?協(xié)議解析器的解決方案

    這篇文章主要介紹了Golang???實現(xiàn)?Redis?協(xié)議解析器,本文將分別介紹Redis 通信協(xié)議 以及 協(xié)議解析器 的實現(xiàn),若您對協(xié)議有所了解可以直接閱讀協(xié)議解析器部分,需要的朋友可以參考下
    2022-10-10
  • GoLand編寫 TCP 端口掃描器的詳細過程

    GoLand編寫 TCP 端口掃描器的詳細過程

    TCP,也就是傳輸控制協(xié)議(Transmission Control Protocol),這篇文章主要介紹了Go語言(Golang)編寫 TCP 端口掃描器,需要的朋友可以參考下
    2023-05-05
  • Go語言使用select{}阻塞main函數(shù)介紹

    Go語言使用select{}阻塞main函數(shù)介紹

    這篇文章主要介紹了Go語言使用select{}阻塞main函數(shù)介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言CSP并發(fā)模型實現(xiàn)MPG

    Go語言CSP并發(fā)模型實現(xiàn)MPG

    這篇文章主要為大家介紹了Go語言CSP并發(fā)模型實現(xiàn)MPG圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論

丹江口市| 仪陇县| 兴安盟| 大渡口区| 博爱县| 富锦市| 台江县| 砀山县| 南和县| 兴国县| 丘北县| 大同县| 长泰县| 兴文县| 浪卡子县| 南城县| 桐柏县| 突泉县| 芜湖市| 洪湖市| 甘孜县| 从化市| 仁化县| 五莲县| 安顺市| 武穴市| 丹棱县| 横峰县| 吐鲁番市| 琼中| 肃宁县| 靖远县| 连南| 和田县| 建瓯市| 石柱| 尉氏县| 米泉市| 北碚区| 扶余县| 元阳县|