最近看 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 的差异就体现在这里。