当你自我炫耀时,便会受到谄媚者的青睐

发掘积累过程的快感

首页 » BIBLE模型 » GoLang » strings.NewReader 与 bufio.NewReader 的差异

strings.NewReader 与 bufio.NewReader 的差异


最近看 golang bufio 包时,有注意到 strings.NewReaderbufio.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 的差异就体现在这里。

互联网信息太多太杂,各互联网公司不断推送娱乐花边新闻,SNS,微博不断转移我们的注意力。但是,我们的时间和精力却是有限的。这里是互联网浩瀚的海洋中的一座宁静与美丽的小岛,供开发者歇息与静心潜心修炼。 “Bible”是圣经,有权威的书,我们的本意就是为开发者提供真正有用的的资料。 我的电子邮件 1217179982@qq.com,您在开发过程中遇到任何问题,欢迎与我联系。
Copyright © 2024. All rights reserved. 本站由 Helay 纯手工打造. 蜀ICP备15017444号