最近看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 的差異就體現在這里。
