• strings.NewReader 与 bufio.NewReader


    最近看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
    ",c,pk)
          if err==io.EOF {
             fmt.Printf("到头了
    ")
             break
          }
          if err!=nil && err!=io.EOF {
             fmt.Printf("读取错误")
             break
          }
    
       }
    }

    看上面例子中,两种给file赋值的方式,第一个就是strings.NewReader,可以将字符串读取给bufio.NewReader使用。下面的那个file赋值是用os包中的Open方法,打开一个文件,然后给bufio.NewReader。

    所以说,strings.NewReader 与 bufio.NewReader 的差异就体现在这里。

     
  • 相关阅读:
    Word 语法高亮
    AsyncFileUpload+Editor
    Silverlight QQ
    网页变黑白…
    Accelerator in Internet Explorer 8
    VS2010中文版安装Silverlight4 Tools…
    Win7下要求以管理员权限运行程序
    AjaxControlToolkitSeaDragon
    WebSlices in Internet Explorer 8
    <当和尚遇到钻石>读书笔记
  • 原文地址:https://www.cnblogs.com/qiaoyanlin/p/12123838.html
Copyright © 2020-2023  润新知