日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag

發(fā)布時(shí)間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Create創(chuàng)建文件:

os.Create:文件不存在則創(chuàng)建,文件存在則刪除文件中的內(nèi)容

語(yǔ)法:

file:創(chuàng)建文件的指針 err:創(chuàng)建文件出現(xiàn)異常后的信息file, err := os.Create("創(chuàng)建文件存放的路徑")

演示:

func CreateFile() {file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")if err != nil {fmt.Println(err)}// 關(guān)流(不關(guān)流會(huì)長(zhǎng)時(shí)間占用內(nèi)存)defer file.Close() }

寫入數(shù)據(jù):

使用WriteString寫數(shù)據(jù):

WriteString底層也是調(diào)用的Write,但是Write需要轉(zhuǎn)換字節(jié)數(shù)組,比較麻煩,WriteString不需要手動(dòng)轉(zhuǎn)換,比較方便

func FileWriteString() {// 創(chuàng)建文件file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")if err != nil {fmt.Println(err)}defer file.Close()// WriteString寫數(shù)據(jù),返回值參數(shù)1是寫的字符長(zhǎng)度,參數(shù)2是異常信息len, err := file.WriteString("WriteString寫入的數(shù)據(jù)")if err != nil {fmt.Println(err)}fmt.Println(len) }

使用Write寫數(shù)據(jù):

func FileWrite() {// 創(chuàng)建文件file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")if err != nil {fmt.Println(err)}defer file.Close()// Write寫數(shù)據(jù),返回值參數(shù)1是寫的字符長(zhǎng)度,參數(shù)2是異常信息str := "Write寫入的數(shù)據(jù)"len, err := file.Write([]byte(str)) //將字符串轉(zhuǎn)換成字節(jié)切片if err != nil {fmt.Println(err)}fmt.Println(len) }

使用WriteAt寫數(shù)據(jù):在指定的位置寫入數(shù)據(jù)

func FileWriteAt() {// 創(chuàng)建文件file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")if err != nil {fmt.Println(err)}defer file.Close()// WriteAt寫數(shù)據(jù),返回值參數(shù)1是寫的字符長(zhǎng)度,參數(shù)2是異常信息// WriteAt寫數(shù)據(jù),參數(shù)列表中參數(shù)1是要寫的數(shù)據(jù),參數(shù)2是要寫入數(shù)據(jù)的開始索引var str string = "WriteAt寫入的數(shù)據(jù)"num, _ := file.Seek(0, io.SeekEnd) //SeekEnd:將數(shù)據(jù)追加到源文件,參數(shù)一:追加數(shù)據(jù)的開始索引,fmt.Println("num:", num)len, err := file.WriteAt([]byte(str), num)if err != nil {fmt.Println(err)}fmt.Println(len) }

OpenFile追加數(shù)據(jù):

  • 文件里已經(jīng)有數(shù)據(jù)的情況下,用上面的三種方式去寫,會(huì)出現(xiàn)覆蓋的效果,WriteAt可以指定索引,但是比較麻煩。

os.OpenFile():打開指定文件進(jìn)行操作

  • OpenFile有三個(gè)參數(shù):
  • 參數(shù)1:打開文件的路徑
  • 參數(shù)2:模式,常見的模式有
參數(shù)說(shuō)明
O_RDONLY只讀方式打開
O_WRONLY只寫方式打開
O_RDWR讀寫方式打開
O_APPEND追加方式打開
O_CREATE不存在,則創(chuàng)建
O_EXCL如果文件存在,且標(biāo)定了O_CREATE的話,則產(chǎn)生一個(gè)錯(cuò)誤
O_TRUNG如果文件存在,且它成功地被打開為只寫或讀寫方式,將其長(zhǎng)度裁剪唯一(覆蓋)
O_NOCTTY如果文件名代表一個(gè)終端設(shè)備,則不把該設(shè)備設(shè)為調(diào)用進(jìn)程的控制設(shè)備
O_NONBLOCK如果文件名代表一個(gè)FIFO,或一個(gè)塊設(shè)備,字符設(shè)備文件,則在以后的文件及I/O操作中置為非阻塞模式
O_SYNC當(dāng)進(jìn)行一系列寫操作時(shí),每次都要等待上次的I/O操作完成再進(jìn)行
  • 參數(shù)3:表示權(quán)限,取值范圍(0-7),和linux里操作文件那個(gè)讀寫一樣

0:沒有任何權(quán)限
1:執(zhí)行權(quán)限(如果是可執(zhí)行文件,是可以運(yùn)行的)
2:寫權(quán)限
3:寫權(quán)限與執(zhí)行權(quán)限
4:讀權(quán)限
5:讀權(quán)限與執(zhí)行權(quán)限
6:讀權(quán)限與寫權(quán)限
7:讀權(quán)限,寫權(quán)限,執(zhí)行權(quán)限

演示:

func OpenFileTest() {// 追加寫數(shù)據(jù)file, err := os.OpenFile("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt", os.O_APPEND|os.O_WRONLY, 6)if err != nil {fmt.Println(err)}defer file.Close()// 通過(guò)文件指針讀寫數(shù)據(jù)len, err := file.WriteString("\t我追加了嗎")if err != nil {fmt.Println(err)}fmt.Println(len) }

Open讀取文件:

讀取指定文件的數(shù)據(jù)

演示:

func OpenFileTest2() {// 追加寫數(shù)據(jù)file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")if err != nil {fmt.Println(err)}defer file.Close()// 讀數(shù)據(jù),定義一個(gè)切片存儲(chǔ)文件讀取的數(shù)據(jù)buffer := make([]byte, 1024)len, err := file.Read(buffer)// len:讀取文件中的數(shù)據(jù)長(zhǎng)度if err != nil {fmt.Println(err)}fmt.Println(len)//fmt.Println(buffer) // 直接打印都是數(shù)字(ascii碼值),長(zhǎng)度是1024,數(shù)據(jù)沒滿的時(shí)候就會(huì)用默認(rèn)值0代替,可以使用截取操作fmt.Println(buffer[:len])fmt.Println(string(buffer[:len])) // 將類型轉(zhuǎn)換為string,可以展示出內(nèi)容 }

ReadBytes緩沖區(qū)讀取:

在使用ReadBytes( )函數(shù)讀取數(shù)據(jù)時(shí),需要用到緩沖區(qū),所謂緩沖區(qū)就是存儲(chǔ)數(shù)據(jù)的區(qū)域,也就是先將從文件中讀取的數(shù)據(jù)存儲(chǔ)在該區(qū)域內(nèi),然后在將區(qū)域中的數(shù)據(jù)取出來(lái),寫到磁盤上。

提供緩沖區(qū)的原因是:

為了緩和 CPU 與 磁盤設(shè)備之間速度不匹配矛盾。文件緩沖區(qū)是用以暫時(shí)存放讀寫期間的文件數(shù)據(jù)而在內(nèi)存區(qū)預(yù)留的一定空間。

演示:

func ReadBytesTest() {// 追加寫數(shù)據(jù)file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")if err != nil {fmt.Println(err)}defer file.Close()// 讀數(shù)據(jù),定義一個(gè)切片存儲(chǔ)文件讀取的數(shù)據(jù)r := bufio.NewReader(file)for {buf, err := r.ReadBytes('\n')if err == io.EOF { // io.EOF是io包中的變量, 表示文件結(jié)束的錯(cuò)誤:break}fmt.Println(err)fmt.Println("buf", string(buf))} }

os.Args:

os.Args是一個(gè)string的切片,可以存儲(chǔ)所有的命令行參數(shù)

package mainimport ("fmt""os" )func main() {// 獲取命令行參數(shù),第0個(gè)參數(shù)是文件本身,后面的是啟動(dòng)可執(zhí)行文件后傳入的參數(shù)args := os.Args// 因?yàn)橐?guī)定了上傳文件需要攜帶至少一個(gè)的文件路徑,所以需要在這里判斷一下上傳的文件數(shù)是否滿足格式if len(args) != 2 {fmt.Println("格式為:go run 可執(zhí)行文件名.go 文件名")return}//提取文件名path := args[1]// 獲取文件屬性stat, err := os.Stat(path)if err != nil {fmt.Println("os.Stat 出錯(cuò)了:", err)return}fmt.Println("文件名:", stat.Name())fmt.Println("文件名:", stat.Size()) }

執(zhí)行結(jié)果:

itzhuzhu@itzhuzhudeMacBook-Pro ~ % go run /Users/itzhuzhu/Desktop/goCode/basics/src/day08/命令行參數(shù).go /Users/itzhuzhu/Desktop/產(chǎn)品經(jīng)理自學(xué)路線圖.jpeg 文件名: 產(chǎn)品經(jīng)理自學(xué)路線圖.jpeg 文件名: 588986 itzhuzhu@itzhuzhudeMacBook-Pro ~ %

flag:

flag包實(shí)現(xiàn)了命令行解析,使用Args拿到命令行參數(shù)如果不是按照順序?qū)懙木蜁?huì)有問題,可以使用flag解析,指定名稱然后帶參數(shù),類似于mysql登錄的時(shí)候?qū)?u -p一樣

func listFiles6() {var user stringvar password stringvar host stringvar port int/**參數(shù)1:設(shè)置對(duì)應(yīng)的標(biāo)簽名,可以通過(guò)該標(biāo)簽名來(lái)或得對(duì)應(yīng)值參數(shù)2:如果沒有設(shè)置該標(biāo)簽,則采用這個(gè)值即該值為默認(rèn)值參數(shù)3:這個(gè)參數(shù)為幫助信息,一般用于help調(diào)用展示&user:接收用戶命令行中輸入的 -u 后面的參數(shù)"u":-u的參數(shù)"":默認(rèn)值"用戶名默認(rèn)為空":提示說(shuō)明*/flag.StringVar(&user, "u", "", "用戶名默認(rèn)為空")flag.StringVar(&password, "p", "", "密碼默認(rèn)為空")flag.StringVar(&host, "h", "localhost", "主機(jī)名默認(rèn)為localhost")flag.IntVar(&port, "port", 8000, "端口號(hào)默認(rèn)8000")// Parse:從args中解析注冊(cè)的flag。也就是轉(zhuǎn)換的flag.Parse()fmt.Printf("user=%v password=%v host=%v port=%v\n", user, password, host, port) }

執(zhí)行結(jié)果:

itzhuzhu@itzhuzhudeMacBook-Pro day06 % go run 文件操作.go -u root -p ppp -h 127.0.0.1 -port 3306 user=root password=ppp host=127.0.0.1 port=3306

總結(jié)

以上是生活随笔為你收集整理的Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。