標籤:go語言 檔案操作
摘要: 本文主要講解go語言的檔案操作.系統底層的open\write等系統調用,往往操作的檔案對象是檔案描述符;而C語言庫的檔案操作需要藉助fopen/fread等函數,它們的操作對象是檔案指標.go語言中,對檔案操作進行了進一步封裝……
1.os包中File類
首先,file類是在os包中的,封裝了底層的檔案描述符和相關資訊,同時封裝了Read和Write的實現。
type File struct { *file}type file struct { fd int name string dirinfo *dirInfo nepipe int}func (f *File) Fd( )uintptr{ if f== nil{ return ^(uintptr(0)) } return uintptr(f.fd)}
//注意,上文中為什麼可以用f.fd這個文法,f是File,而File中沒有成員?
func (f *File) Close() error{}func (f *File)Stat ()(fi FileInfo, err error){}
同時File類還實現了如下方法:
func (f *File) read(b []byte) (n int, err error);func (f *File) write(b []byte) (n int, err error) ;func (f *File) seek(offset int64, whence int) (ret int64, err error) ;
2.io.ReadCloser
在go語言中,帶有er尾碼的往往是介面,ReadCloser顧名思義,就是包含Read和Close方法的借口。我們去看看這兩個介面的定義和實現:
type Reader interface { Read(p []byte) (n int, err error)}type Closer interface { Close() error}
注意:不同的包中對Reader的定義是不同的,下面是bufio中對Reader的定義
3. bufio package
type Reader struct { // contains filtered or unexported fields}type Reader struct { buf []byte rd io.Reader r, w int err error lastByte int lastRuneSize int}
bufio是帶有緩衝的io讀寫包,我們先來看一個例子:
package main import ( "fmt" "os" "bufio" "io" ) func main() { f, err := os.Open("c:\\aaa.txt")//開啟檔案 defer f.Close() //開啟檔案出錯處理 if nil == err { buff := bufio.NewReader(f) //讀入緩衝 for { line, err := buff.ReadString(‘\n‘) //以‘\n‘為結束符讀入一行 if err != nil || io.EOF == err { break } fmt.Print(line) //可以對一行進行處理 } } }
func NewReader(rd io.Reader) *Reader
//NewReader returns a new Reader whose buffer has the default size.
4.執行個體
type Request struct { // The message body. ... Body io.ReadCloser ...}
所以說,如果我們想實現Request中的Body,僅僅需要實現io package中的兩個interface就可以了.
go語言檔案操作