搞定Go語言 第2天13 Go語言檔案操作

2021-10-10 16:06:39 字數 3459 閱讀 1782

計算機中的檔案是儲存在外部介質(通常是磁碟)上的資料集合,檔案分為文字檔案和二進位制檔案。

os.open()函式能夠開啟乙個檔案,返回乙個*file和乙個err。對得到的檔案例項呼叫close()方法能夠關閉檔案。

package main

import

("fmt"

"os"

)func main(

) // 關閉檔案

file.close(

)}

為了防止檔案忘記關閉,我們通常使用defer註冊檔案關閉語句。

file.read(

)

基本使用

read方法定義如下:

func (f *file) read(b [

]byte)

(n int, err error)

它接收乙個位元組切片,返回讀取的位元組數和可能的具體錯誤,讀到檔案末尾時會返回0和io.eof。 舉個例子:

func main(

) defer file.close(

) // 使用read方法讀取資料

var tmp = make(

byte, 128)

n, err := file.read(tmp)

if err == io.eof

if err != nil

fmt.printf(

"讀取了%d位元組資料\n", n)

fmt.println(string(tmp[:n]

))}

使用for迴圈讀取檔案中的所有資料。

func main(

) defer file.close(

) // 迴圈讀取檔案

var content [

]byte

var tmp = make(

byte, 128)

forif err != nil

...)

} fmt.println(string(content))

}

bufio是在file的基礎上封裝了一層api,支援更多的功能。

package main

import

("bufio"

"fmt"

"io"

"os"

)// bufio按行讀取示例

func main(

) defer file.close(

) reader := bufio.newreader(file)

for fmt.println(

"檔案讀完了"

)break

}if err != nil

fmt.print(line)

}}

io/ioutil包的readfile方法能夠讀取完整的檔案,只需要將檔名作為引數傳入。

package main

import

("fmt"

"io/ioutil"

)// ioutil.readfile讀取整個檔案

func main(

) fmt.println(string(content))

}

os.openfile()函式能夠以指定模式開啟檔案,從而實現檔案寫入相關功能。

func openfile(name string, flag int, perm filemode)

(*file, error)

其中:

name:要開啟的檔名 flag:開啟檔案的模式。 模式有以下幾種:

模式	含義

os.o_wronly 只寫

os.o_create 建立檔案

os.o_rdonly 唯讀

os.o_rdwr 讀寫

os.o_trunc 清空

perm:檔案許可權,乙個八進位制數。r(讀)04,w(寫)02,x(執行)01。

func main(

) defer file.close(

) str :=

"hello 沙河"

file.write(

byte(str)) //寫入位元組切片資料

file.writestring(

"hello 小王子"

) //直接寫入字串資料

}bufio.newwriter

func main(

) defer file.close(

) writer := bufio.newwriter(file)

for i := 0; i < 10; i++

writer.flush(

) //將快取中的內容寫入檔案

}ioutil.writefile

func main(

)}

借助io.copy()實現乙個拷貝檔案函式。

// copyfile 拷貝檔案函式

func copyfile(dstname, srcname string)

(written int64, err error)

defer src.close(

) // 以寫|建立的方式開啟目標檔案

dst, err := os.openfile(dstname, os.o_wronly|os.o_create, 0644)

if err != nil

defer dst.close(

)return io.copy(dst, src) //呼叫io.copy(

)拷貝內容

}func main(

) fmt.println(

"copy done!"

)}

使用檔案操作相關知識,模擬實現linux平台cat命令的功能。

package main

import

("bufio"

"flag"

"fmt"

"io"

"os"

)// cat命令實現

func cat(r *bufio.reader)

fmt.fprintf(os.stdout, "%s", buf)}}

func main(

) // 依次讀取每個指定檔案的內容並列印到終端

for i := 0; i < flag.narg(

); i++

cat(bufio.newreader(f))

}}

呼叫示例:

go build main.go

./main …/test.txt

其中test.txt檔案中需要存在換行符『\n』

1 3Go語言環境

為了便於 學習與分享,建議各位大佬可以前往 github 免費註冊乙個賬戶,在此有很多優秀的go專案,可以較快的提高自己的開發能力。成功註冊github賬戶後,可以象下面這樣建立用於儲存 源 的資料夾 github賬戶名 macos或linux mkdir gopath src github.com...

13 go語言 開始專案實戰

1 爬蟲專案介紹 網路爬蟲分類 通用爬蟲,如baidu,google 聚焦爬蟲,從網際網路獲取結構化資料 go語言的爬蟲庫 框架 henrylee2cn pholcus gocrawl colly hu17889 go spider 將不使用現成的爬蟲庫 框架 使用elasticsearch作為資料...

13Go語言基礎之介面

本文是李文周的部落格go語言學習之路的目錄提要版,方便複習檢視使用,原文參見文章連線 介面 inte ce 定義了乙個物件的行為規範,只定義規範不實現,由具體的物件來實現規範的細節。在go語言中介面 inte ce 是一種型別,一種抽象的型別。inte ce是一組method的集合,是duck ty...