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