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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM