Go寫文件的幾種姿勢,你喜歡哪一種?
當前使用Go版本
go?version?go1.16.5?darwin/amd64
一次將全部內容寫入文件
將數(shù)據(jù)寫入文件的最快方法是使用該os.WriteFile()函數(shù)。它需要三個輸入?yún)?shù):
我們要寫入的文件的路徑 我們要寫入文件的字節(jié)數(shù)據(jù) 將創(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)
????}
}
參考資料
file system permission: https://en.wikipedia.org/wiki/File-system_permissions
![]()
