最近看golang bufio包時,有注意到strings.NewReader
與 bufio.NewReader
這兩個方法,那么這兩個都是做什么用的呢?
strings.NewReader 注意看這個方法的內容
//reader包中 Reader 結構體 // A Reader implements the io.Reader, io.ReaderAt, io.Seeker, io.WriterTo, // io.ByteScanner, and io.RuneScanner interfaces by reading // from a string. type Reader struct { s string i int64 // current reading index prevRune int // index of previous rune; or < 0 } func NewReader(s string) *Reader { return &Reader{s, 0, -1} } 返回的是一個Reader 結構體
string.NewReader 的參數是字符串,這個方法其實可以和os包中的Open有異曲同工之妙。接下來還是先看看bufio.NewReader這個函數的具體實現
bufio.NewReader 是bufio包里面的一個函數,
bufio包中的Reader 結構體 // Reader implements buffering for an io.Reader object. type Reader struct { buf []byte rd io.Reader // reader provided by the client r, w int // buf read and write positions err error lastByte int lastRuneSize int } const ( defaultBufSize = 4096 ) // NewReader returns a new Reader whose buffer has the default size. func NewReader(rd io.Reader) *Reader { return NewReaderSize(rd, defaultBufSize) } // NewReaderSize returns a new Reader whose buffer has at least the specified // size. If the argument io.Reader is already a Reader with large enough // size, it returns the underlying Reader. func NewReaderSize(rd io.Reader, size int) *Reader { // Is it already a Reader? b, ok := rd.(*Reader) if ok && len(b.buf) >= size { return b } if size < minReadBufferSize { size = minReadBufferSize } r := new(Reader) r.reset(make([]byte, size), rd) return r }
其實這兩個包完全是兩回事,那么我們為什么要在一篇文章里面來舉例說明呢?看下面的實例:
func Parseing(){ Config.TimeoutTotal=5*time.Second //file:=strings.NewReader("testline") file,err=os.Open("/Users/helay/go/src/workspace/webkkCurl/etc/curl.conf") if err!=nil { fmt.Printf("%s",err) return } read:=bufio.NewReader(file) for { c,pk,err:=read.ReadLine() fmt.Printf("這一行的內容是:%s;pk是:%t\n",c,pk) if err==io.EOF { fmt.Printf("到頭了\n") break } if err!=nil && err!=io.EOF { fmt.Printf("讀取錯誤") break } } }
看上面例子中,兩種給file賦值的方式,第一個就是strings.NewReader,可以將字符串讀取給bufio.NewReader使用。下面的那個file賦值是用os包中的Open方法,打開一個文件,然后給bufio.NewReader。
所以說,strings.NewReader 與 bufio.NewReader 的差異就體現在這里。