<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go寫文件的幾種姿勢,你喜歡哪一種?

          共 3569字,需瀏覽 8分鐘

           ·

          2021-12-13 07:21

          Go 對文件操作有很好的內置支持。使用該os包,您可以輕松地打開、讀取、寫入和關閉文件。在這個例子中,我們專注于將數(shù)據(jù)寫入文件。我們向您展示如何以不同的方式寫入文本和二進制數(shù)據(jù) - 一次寫入整個數(shù)據(jù)、一行一行的寫入數(shù)據(jù)、在指定的bytes數(shù)組中寫入、或以buffer方式寫入數(shù)據(jù)。

          當前使用Go版本

          go?version?go1.16.5?darwin/amd64

          一次將全部內容寫入文件

          將數(shù)據(jù)寫入文件的最快方法是使用該os.WriteFile()函數(shù)。它需要三個輸入?yún)?shù):

          1. 我們要寫入的文件的路徑
          2. 我們要寫入文件的字節(jié)數(shù)據(jù)
          3. 將創(chuàng)建的文件的權限[1]

          創(chuàng)建和關閉文件由函數(shù)本身完成,因此無需在寫入前后創(chuàng)建或關閉文件。

          如果您使用的是 1.16 之前的 Go 版本,您將WriteFile()ioutil包中找到該功能。

          package?main

          import?(
          ????"log"
          ????"os"
          )

          func?main()?{
          ????if?err?:=?os.WriteFile("file.txt",?[]byte("Hello?GOSAMPLES!"),?0666);?err?!=?nil?{
          ????????log.Fatal(err)
          ????}
          }

          將文本數(shù)據(jù)逐行寫入文件

          如果您將文件的行放在單獨的變量、數(shù)組中,或者想在寫入一行之前進行一些處理,則可以使用該func (*File) WriteString()方法逐行寫入數(shù)據(jù)。您需要做的就是創(chuàng)建一個文件,將字符串寫入其中,最后關閉該文件。

          package?main

          import?(
          ????"log"
          ????"os"
          )

          var?lines?=?[]string{
          ????"Go",
          ????"is",
          ????"the",
          ????"best",
          ????"programming",
          ????"language",
          ????"in",
          ????"the",
          ????"world",
          }

          func?main()?{
          ????//?create?file
          ????f,?err?:=?os.Create("file.txt")
          ????if?err?!=?nil?{
          ????????log.Fatal(err)
          ????}
          ????//?remember?to?close?the?file
          ????defer?f.Close()

          ????for?_,?line?:=?range?lines?{
          ????????_,?err?:=?f.WriteString(line?+?"\n")
          ????????if?err?!=?nil?{
          ????????????log.Fatal(err)
          ????????}
          ????}
          }

          將字節(jié)數(shù)據(jù)寫入文件

          與逐行寫入字符串一樣,我們也可以使用該func (*File) Write()方法寫入字節(jié)數(shù)據(jù),或者func (*File) WriteAt()如果您想以給定的偏移量寫入數(shù)據(jù)。

          package?main

          import?(
          ????"log"
          ????"os"
          )

          var?bytes?=?[]byte{
          ????0x47,?//?G
          ????0x4f,?//?O
          ????0x20,?//?
          ????0x20,?//?
          ????0x20,?//?
          ????0x50,?//?P
          ????0x4c,?//?L
          ????0x45,?//?E
          ????0x53,?//?S
          }

          var?additionalBytes?=?[]byte{
          ????0x53,?//?S
          ????0x41,?//?A
          ????0x4d,?//?M
          }

          func?main()?{
          ????//?create?file
          ????f,?err?:=?os.Create("file.txt")
          ????if?err?!=?nil?{
          ????????log.Fatal(err)
          ????}
          ????//?remember?to?close?the?file
          ????defer?f.Close()

          ????//?write?bytes?to?the?file
          ????_,?err?=?f.Write(bytes)
          ????if?err?!=?nil?{
          ????????log.Fatal(err)
          ????}

          ????//?write?additional?bytes?to?the?file,?start?at?index?2
          ????_,?err?=?f.WriteAt(additionalBytes,?2)
          ????if?err?!=?nil?{
          ????????log.Fatal(err)
          ????}
          }

          將格式化后的字符串寫入文件

          除了File方法之外,我們還可以使用fmt.Fprintln()函數(shù)將數(shù)據(jù)寫入文件。此函數(shù)格式化其操作數(shù),在它們之間添加空格,在末尾添加一個新行,并將輸出寫入 writer(第一個參數(shù))。它非常適合簡單的行格式化或將 a 的字符串表示形式寫入struct文件。

          package?main

          import?(
          ????"fmt"
          ????"log"
          ????"os"
          )

          var?lines?=?[]string{
          ????"Go",
          ????"is",
          ????"the",
          ????"best",
          ????"programming",
          ????"language",
          ????"in",
          ????"the",
          ????"world",
          }

          func?main()?{
          ????//?create?file
          ????f,?err?:=?os.Create("file.txt")
          ????if?err?!=?nil?{
          ????????log.Fatal(err)
          ????}
          ????//?remember?to?close?the?file
          ????defer?f.Close()

          ????for?_,?line?:=?range?lines?{
          ????????_,?err?:=?fmt.Fprintln(f,?"*",?line,?"*")
          ????????if?err?!=?nil?{
          ????????????log.Fatal(err)
          ????????}
          ????}
          }

          使用緩沖寫入文件

          如果您經常將少量數(shù)據(jù)寫入文件,則會降低程序的性能。每次寫入都是一個代價高昂的系統(tǒng)調用,如果您不需要立即更新文件,最好將這些小寫入歸為一個。為此,我們可以使用bufio.Writer結構。它的寫入函數(shù)不會直接將數(shù)據(jù)保存到文件中,而是一直保存到下面的緩沖區(qū)已滿(默認大小為 4096 字節(jié))或Flush()調用該方法。所以一定要Flush()在寫入完成后調用,將剩余的數(shù)據(jù)保存到文件中。

          package?main

          import?(
          ????"bufio"
          ????"log"
          ????"os"
          )

          var?lines?=?[]string{
          ????"Go",
          ????"is",
          ????"the",
          ????"best",
          ????"programming",
          ????"language",
          ????"in",
          ????"the",
          ????"world",
          }

          func?main()?{
          ????//?create?file
          ????f,?err?:=?os.Create("file.txt")
          ????if?err?!=?nil?{
          ????????log.Fatal(err)
          ????}
          ????//?remember?to?close?the?file
          ????defer?f.Close()

          ????//?create?new?buffer
          ????buffer?:=?bufio.NewWriter(f)

          ????for?_,?line?:=?range?lines?{
          ????????_,?err?:=?buffer.WriteString(line?+?"\n")
          ????????if?err?!=?nil?{
          ????????????log.Fatal(err)
          ????????}
          ????}

          ????//?flush?buffered?data?to?the?file
          ????if?err?:=?buffer.Flush();?err?!=?nil?{
          ????????log.Fatal(err)
          ????}
          }

          參考資料

          [1]

          file system permission: https://en.wikipedia.org/wiki/File-system_permissions


          文章轉載:云原生生態(tài)圈
          (版權歸原作者所有,侵刪)




          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  137无码XXXX肉体裸交摄影XXX | 91在线无码精品秘 入口九色1 | 全部免费黄色视频 | 手机免费观看AV | 亚洲视频在线观看视频在线 |