Golang標(biāo)準(zhǔn)庫(kù)——bufio

bufio

bufio包實(shí)現(xiàn)了有緩沖的I/O。它包裝一個(gè)io.Reader或io.Writer接口對(duì)象,創(chuàng)建另一個(gè)也實(shí)現(xiàn)了該接口,且同時(shí)還提供了緩沖和一些文本I/O的幫助函數(shù)的對(duì)象。

Constants

const (
    defaultBufSize = 4096
)

Variables

var (
    ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
    ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
    ErrBufferFull        = errors.New("bufio: buffer full")
    ErrNegativeCount     = errors.New("bufio: negative count")
)
var (
    ErrTooLong         = errors.New("bufio.Scanner: token too long")
    ErrNegativeAdvance = errors.New("bufio.Scanner: SplitFunc returns negative advance count")
    ErrAdvanceTooFar   = errors.New("bufio.Scanner: SplitFunc returns advance count beyond input")
)

會(huì)被Scanner類型返回的錯(cuò)誤。

type Reader

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 // last byte read for UnreadByte; -1 means invalid
    lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
}

Reader實(shí)現(xiàn)了給一個(gè)io.Reader接口對(duì)象附加緩沖。

func NewReader

func NewReader(rd io.Reader) *Reader

NewReader創(chuàng)建一個(gè)具有默認(rèn)大小緩沖、從r讀取的*Reader。NewReader 相當(dāng)于 NewReaderSize(rd, 4096)

func NewReaderSize

func NewReaderSize(rd io.Reader, size int) *Reader

NewReaderSize創(chuàng)建一個(gè)具有最少有size尺寸的緩沖、從r讀取的Reader。如果參數(shù)r已經(jīng)是一個(gè)具有足夠大緩沖的 Reader類型值,會(huì)返回r。

func (*Reader)Reset(r io.Reader)

func (b *Reader) Reset(r io.Reader)

Reset丟棄緩沖中的數(shù)據(jù),清除任何錯(cuò)誤,將b重設(shè)為其下層從r讀取數(shù)據(jù)。

func main() {
   s := strings.NewReader("ABCEFG")
   str := strings.NewReader("123455")
   br := bufio.NewReader(s)
   b, _ := br.ReadString('\n')
   fmt.Println(b)    
   br.Reset(str)
   b, _ = br.ReadString('\n')
   fmt.Println(b)     
}

func (*Reader)Bufferd

func (b *Reader) Buffered() int

Buffered返回緩沖中現(xiàn)有的可讀取的字節(jié)數(shù)。

func main() {
   s := strings.NewReader("abcdefg")
   br := bufio.NewReader(s)

   fmt.Println(br.Buffered())

   br.Peek(1)
   fmt.Println(br.Buffered())
}

func (*Reader)Peek

func (b *Reader) Peek(n int) ([]byte, error)

Peek返回輸入流的下n個(gè)字節(jié),而不會(huì)移動(dòng)讀取位置。返回的[]byte只在下一次調(diào)用讀取操作前合法。如果Peek返回的切片長(zhǎng)度比n小,它也會(huì)返會(huì)一個(gè)錯(cuò)誤說(shuō)明原因。如果n比緩沖尺寸還大,返回的錯(cuò)誤將是ErrBufferFull。

func main() {
   s := strings.NewReader("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   br := bufio.NewReader(s)
   
   b, _ := br.Peek(5)
   fmt.Printf("%s\n", b)

   b[0] = 'a'
   b, _ = br.Peek(5)
   fmt.Printf("%s\n", b)
}

func (*Reader)Read

func (b *Reader) Read(p []byte) (n int, err error)

Read讀取數(shù)據(jù)寫入p。本方法返回寫入p的字節(jié)數(shù)。本方法一次調(diào)用最多會(huì)調(diào)用下層Reader接口一次Read方法,因此返回值n可能小于len(p)。讀取到達(dá)結(jié)尾時(shí),返回值n將為0而err將為io.EOF。

func main() {
   s := strings.NewReader("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
   br := bufio.NewReader(s)
   p := make([]byte, 10)

   n, err := br.Read(p)
   fmt.Printf("%-20s %-2v %v\n", p[:n], n, err)

   n, err = br.Read(p)
   fmt.Printf("%-20s %-2v %v\n", p[:n], n, err)

   n, err = br.Read(p)
   fmt.Printf("%-20s %-2v %v\n", p[:n], n, err)

   n, err = br.Read(p)
   fmt.Printf("%-20s %-2v %v\n", p[:n], n, err)

   n, err = br.Read(p)
   fmt.Printf("%-20s %-2v %v\n", p[:n], n, err)

   n, err = br.Read(p)
   fmt.Printf("%-20s %-2v %v\n", p[:n], n, err)
}

func (*Reader)ReadByte

func (b *Reader) ReadByte() (c byte, err error)

ReadByte讀取并返回一個(gè)字節(jié)。如果沒(méi)有可用的數(shù)據(jù),會(huì)返回錯(cuò)誤。

func (*Reader)UnreadByte

func (b *Reader) UnreadByte() error

UnreadByte吐出最近一次讀取操作讀取的最后一個(gè)字節(jié)。(只能吐出最后一個(gè),多次調(diào)用會(huì)出問(wèn)題)

func main() {
   s := strings.NewReader("ABCDEFG")
   br := bufio.NewReader(s)

   c, _ := br.ReadByte()
   fmt.Printf("%c\n", c)

   c, _ = br.ReadByte()
   fmt.Printf("%c\n", c)

   br.UnreadByte()
   c, _ = br.ReadByte()
   fmt.Printf("%c\n", c)
}

func (*Reader)ReadRune

func (b *Reader) ReadRune() (r rune, size int, err error)

ReadRune讀取一個(gè)utf-8編碼的unicode碼值,返回該碼值、其編碼長(zhǎng)度和可能的錯(cuò)誤。如果utf-8編碼非法,讀取位置只移動(dòng)1字節(jié),返回U+FFFD,返回值size為1而err為nil。如果沒(méi)有可用的數(shù)據(jù),會(huì)返回錯(cuò)誤。

func (*Reader)UnreadRune

func (b *Reader) UnreadRune() error

UnreadRune吐出最近一次ReadRune調(diào)用讀取的unicode碼值。如果最近一次讀取不是調(diào)用的ReadRune,會(huì)返回錯(cuò)誤。(從這點(diǎn)看,UnreadRune比UnreadByte嚴(yán)格很多)

func main() {
   s := strings.NewReader("你好,世界!")
   br := bufio.NewReader(s)

   c, size, _ := br.ReadRune()
   fmt.Printf("%c %v\n", c, size)

   c, size, _ = br.ReadRune()
   fmt.Printf("%c %v\n", c, size)

   br.UnreadRune()
   c, size, _ = br.ReadRune()
   fmt.Printf("%c %v\n", c, size)
}

func (*Reader)ReadLine

func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)

ReadLine是一個(gè)低水平的行數(shù)據(jù)讀取原語(yǔ)。大多數(shù)調(diào)用者應(yīng)使用ReadBytes('\n')或ReadString('\n')代替,或者使用Scanner。

ReadLine嘗試返回一行數(shù)據(jù),不包括行尾標(biāo)志的字節(jié)。如果行太長(zhǎng)超過(guò)了緩沖,返回值isPrefix會(huì)被設(shè)為true,并返回行的前面一部分。該行剩下的部分將在之后的調(diào)用中返回。返回值isPrefix會(huì)在返回該行最后一個(gè)片段時(shí)才設(shè)為false。返回切片是緩沖的子切片,只在下一次讀取操作之前有效。ReadLine要么返回一個(gè)非nil的line,要么返回一個(gè)非nil的err,兩個(gè)返回值至少一個(gè)非nil。

返回的文本不包含行尾的標(biāo)志字節(jié)("\r\n"或"\n")。如果輸入流結(jié)束時(shí)沒(méi)有行尾標(biāo)志字節(jié),方法不會(huì)出錯(cuò),也不會(huì)指出這一情況。在調(diào)用ReadLine之后調(diào)用UnreadByte會(huì)總是吐出最后一個(gè)讀取的字節(jié)(很可能是該行的行尾標(biāo)志字節(jié)),即使該字節(jié)不是ReadLine返回值的一部分。

func main() {
   s := strings.NewReader("ABC\nDEF\r\nGHI\r\nGHI")
   br := bufio.NewReader(s)

   w, isPrefix, _ := br.ReadLine()
   fmt.Printf("%q %v\n", w, isPrefix)

   w, isPrefix, _ = br.ReadLine()
   fmt.Printf("%q %v\n", w, isPrefix)

   w, isPrefix, _ = br.ReadLine()
   fmt.Printf("%q %v\n", w, isPrefix)

   w, isPrefix, _ = br.ReadLine()
   fmt.Printf("%q %v\n", w, isPrefix)
}

func (*Reader)ReadSlice

func (b *Reader) ReadSlice(delim byte) (line []byte, err error)

ReadSlice讀取直到第一次遇到delim字節(jié),返回緩沖里的包含已讀取的數(shù)據(jù)和delim字節(jié)的切片。該返回值只在下一次讀取操作之前合法。如果ReadSlice放在在讀取到delim之前遇到了錯(cuò)誤,它會(huì)返回在錯(cuò)誤之前讀取的數(shù)據(jù)在緩沖中的切片以及該錯(cuò)誤(一般是io.EOF)。如果在讀取到delim之前緩沖就被寫滿了,ReadSlice失敗并返回ErrBufferFull。因?yàn)镽eadSlice的返回值會(huì)被下一次I/O操作重寫,調(diào)用者應(yīng)盡量使用ReadBytes或ReadString替代本法功法。當(dāng)且僅當(dāng)ReadBytes方法返回的切片不以delim結(jié)尾時(shí),會(huì)返回一個(gè)非nil的錯(cuò)誤。

func main() {
   s := strings.NewReader("ABC,DEF,GHI,JKL")
   br := bufio.NewReader(s)

   w, _ := br.ReadSlice(',')
   fmt.Printf("%q\n", w)

   w, _ = br.ReadSlice(',')
   fmt.Printf("%q\n", w)

   w, _ = br.ReadSlice(',')
   fmt.Printf("%q\n", w)
}

func (*Reader)ReadBytes

func (b *Reader) ReadBytes(delim byte) (line []byte, err error)

ReadBytes讀取直到第一次遇到delim字節(jié),返回一個(gè)包含已讀取的數(shù)據(jù)和delim字節(jié)的切片。如果ReadBytes方法在讀取到delim之前遇到了錯(cuò)誤,它會(huì)返回在錯(cuò)誤之前讀取的數(shù)據(jù)以及該錯(cuò)誤(一般是io.EOF)。當(dāng)且僅當(dāng)ReadBytes方法返回的切片不以delim結(jié)尾時(shí),會(huì)返回一個(gè)非nil的錯(cuò)誤。

func main() {
   s := strings.NewReader("ABC DEF GHI JKL")
   br := bufio.NewReader(s)

   w, _ := br.ReadBytes(' ')
   fmt.Printf("%q\n", w)

   w, _ = br.ReadBytes(' ')
   fmt.Printf("%q\n", w)

   w, _ = br.ReadBytes(' ')
   fmt.Printf("%q\n", w)
}

func (*Reader)ReadString

func (b *Reader) ReadString(delim byte) (line string, err error)

ReadString讀取直到第一次遇到delim字節(jié),返回一個(gè)包含已讀取的數(shù)據(jù)和delim字節(jié)的字符串。如果ReadString方法在讀取到delim之前遇到了錯(cuò)誤,它會(huì)返回在錯(cuò)誤之前讀取的數(shù)據(jù)以及該錯(cuò)誤(一般是io.EOF)。當(dāng)且僅當(dāng)ReadString方法返回的切片不以delim結(jié)尾時(shí),會(huì)返回一個(gè)非nil的錯(cuò)誤。

func main() {
   s := strings.NewReader("ABC DEF GHI JKL")
   br := bufio.NewReader(s)

   w, _ := br.ReadString(' ')
   fmt.Printf("%q\n", w)

   w, _ = br.ReadString(' ')
   fmt.Printf("%q\n", w)

   w, _ = br.ReadString(' ')
   fmt.Printf("%q\n", w)
}

func (*Reader)WriteTo

func (b *Reader) WriteTo(w io.Writer) (n int64, err error)

WriteTo方法實(shí)現(xiàn)了io.WriterTo接口。

func main() {
   s := strings.NewReader("ABCEFGHIJKLMN")
   br := bufio.NewReader(s)
   b := bytes.NewBuffer(make([]byte, 0))

   br.WriteTo(b)
   fmt.Printf("%s\n", b)
}

type Writer

type Writer struct {
    err error
    buf []byte
    n   int
    wr  io.Writer
}

Writer實(shí)現(xiàn)了為io.Writer接口對(duì)象提供緩沖。如果在向一個(gè)Writer類型值寫入時(shí)遇到了錯(cuò)誤,該對(duì)象將不再接受任何數(shù)據(jù),且所有寫操作都會(huì)返回該錯(cuò)誤。在說(shuō)有數(shù)據(jù)都寫入后,調(diào)用者有義務(wù)調(diào)用Flush方法以保證所有的數(shù)據(jù)都交給了下層的io.Writer。

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter創(chuàng)建一個(gè)具有默認(rèn)大小緩沖、寫入w的*Writer。NewWriter 相當(dāng)于 NewWriterSize(wr, 4096)

func NewWriterSize

func NewWriterSize(w io.Writer, size int) *Writer

NewWriterSize創(chuàng)建一個(gè)具有最少有size尺寸的緩沖、寫入w的Writer。如果參數(shù)w已經(jīng)是一個(gè)具有足夠大緩沖的Writer類型值,會(huì)返回w。

func (*Writer)Reset

func (b *Writer) Reset(w io.Writer)

Reset丟棄緩沖中的數(shù)據(jù),清除任何錯(cuò)誤,將b重設(shè)為將其輸出寫入w。

func main() {
   b := bytes.NewBuffer(make([]byte, 0))
   bw := bufio.NewWriter(b)
   bw.WriteString("123456789")
   c := bytes.NewBuffer(make([]byte, 0))
   bw.Reset(c)
   bw.WriteString("456")
   bw.Flush()
   fmt.Println(b)       
   fmt.Println(c) 
}

func (*Writer)Bufferd

func (b *Writer) Buffered() int

Buffered返回緩沖中已使用的字節(jié)數(shù)。

func (*Writer)Available

func (b *Writer) Available() int

Available返回緩沖中還有多少字節(jié)未使用。

func (*Writer) Write

func (b *Writer) Write(p []byte) (nn int, err error)

Write將p的內(nèi)容寫入緩沖。返回寫入的字節(jié)數(shù)。如果返回值nn < len(p),還會(huì)返回一個(gè)錯(cuò)誤說(shuō)明原因。

func (*Writer) WriteString

func (b *Writer) WriteString(s string) (int, error)

WriteString寫入一個(gè)字符串。返回寫入的字節(jié)數(shù)。如果返回值nn < len(s),還會(huì)返回一個(gè)錯(cuò)誤說(shuō)明原因。

func (*Writer) WriteByte

func (b *Writer) WriteByte(c byte) error

WriteByte寫入單個(gè)字節(jié)。

func (*Writer) WriteRune

func (b *Writer) WriteRune(r rune) (size int, err error)

WriteRune寫入一個(gè)unicode碼值(的utf-8編碼),返回寫入的字節(jié)數(shù)和可能的錯(cuò)誤。

func (*Writer) Flush

func (b *Writer) Flush() error

Flush方法將緩沖中的數(shù)據(jù)寫入下層的io.Writer接口。

func (*Writer) ReadFrom

func (b *Writer) ReadFrom(r io.Reader) (n int64, err error)

ReadFrom實(shí)現(xiàn)了io.ReaderFrom接口。

func main() {
   b := bytes.NewBuffer(make([]byte, 0))
   bw := bufio.NewWriter(b)
   fmt.Println(bw.Available()) // 4096
   fmt.Println(bw.Buffered())  // 0

   bw.WriteString("ABCDEFGHIJKLMN")
   fmt.Println(bw.Available()) 
   fmt.Println(bw.Buffered())  
   fmt.Printf("%q\n", b)      

   bw.Flush()
   fmt.Println(bw.Available())
   fmt.Println(bw.Buffered())  
   fmt.Printf("%q\n", b)     
}
func main() {
   b := bytes.NewBuffer(make([]byte, 0))
   bw := bufio.NewWriter(b)
   // 寫入緩存
   // byte等同于 int8
   bw.WriteByte('H')
   bw.WriteByte('e')
   bw.WriteByte('l')
   bw.WriteByte('l')
   bw.WriteByte('o')
   bw.WriteByte(' ')
   // rune等同于int32
   bw.WriteRune('世')
   bw.WriteRune('界')
   bw.WriteRune('!')
   // 寫入b
   bw.Flush()
   fmt.Println(b)
}
func main() {
   b := bytes.NewBuffer(make([]byte, 0))
   s := strings.NewReader("Hello 世界!")
   bw := bufio.NewWriter(b)
   bw.ReadFrom(s)
   //bw.Flush()            //ReadFrom無(wú)需使用Flush,其自己已經(jīng)寫入.
   fmt.Println(b) // Hello 世界!
}

type ReadWriter

type ReadWriter struct {
    *Reader
    *Writer
}

ReadWriter類型保管了指向Reader和Writer類型的指針,(因此)實(shí)現(xiàn)了io.ReadWriter接口。

func NewReadWriter

func NewReadWriter(r *Reader, w *Writer) *ReadWriter

NewReadWriter申請(qǐng)創(chuàng)建一個(gè)新的、將讀寫操作分派給r和w 的ReadWriter。

func main() {
   b := bytes.NewBuffer(make([]byte, 0))
   bw := bufio.NewWriter(b)
   s := strings.NewReader("123")
   br := bufio.NewReader(s)
   rw := bufio.NewReadWriter(br, bw)
   p, _ := rw.ReadString('\n')
   fmt.Println(string(p))              //123
   rw.WriteString("asdf")
   rw.Flush()
   fmt.Println(b)                          //asdf
}

type SplitFunc

type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)

SplitFunc類型代表用于對(duì)輸出作詞法分析的分割函數(shù)。

參數(shù)data是尚未處理的數(shù)據(jù)的一個(gè)開(kāi)始部分的切片,參數(shù)atEOF表示是否Reader接口不能提供更多的數(shù)據(jù)。返回值是解析位置前進(jìn)的字節(jié)數(shù),將要返回給調(diào)用者的token切片,以及可能遇到的錯(cuò)誤。如果數(shù)據(jù)不足以(保證)生成一個(gè)完整的token,例如需要一整行數(shù)據(jù)但data里沒(méi)有換行符,SplitFunc可以返回(0, nil, nil)來(lái)告訴Scanner讀取更多的數(shù)據(jù)寫入切片然后用從同一位置起始、長(zhǎng)度更長(zhǎng)的切片再試一次(調(diào)用SplitFunc類型函數(shù))。

如果返回值err非nil,掃描將終止并將該錯(cuò)誤返回給Scanner的調(diào)用者。

除非atEOF為真,永遠(yuǎn)不會(huì)使用空切片data調(diào)用SplitFunc類型函數(shù)。然而,如果atEOF為真,data卻可能是非空的、且包含著未處理的文本。

SplitFunc 的作用很簡(jiǎn)單,從 data 中找出你感興趣的數(shù)據(jù),然后返回并告訴調(diào)用者,data 中有多少數(shù)據(jù)你已經(jīng)處理過(guò)了

func ScanBytes

func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error)

ScanBytes是用于Scanner類型的分割函數(shù)(符合SplitFunc),本函數(shù)會(huì)將每個(gè)字節(jié)作為一個(gè)token返回。

func ScanRunes

func ScanRunes(data []byte, atEOF bool) (advance int, token []byte, err error)

ScanRunes是用于Scanner類型的分割函數(shù)(符合SplitFunc),本函數(shù)會(huì)將每個(gè)utf-8編碼的unicode碼值作為一個(gè)token返回。本函數(shù)返回的rune序列和range一個(gè)字符串的輸出rune序列相同。錯(cuò)誤的utf-8編碼會(huì)翻譯為U+FFFD = "\xef\xbf\xbd",但只會(huì)消耗一個(gè)字節(jié)。調(diào)用者無(wú)法區(qū)分正確編碼的rune和錯(cuò)誤編碼的rune。

func ScanWords

func ScanWords(data []byte, atEOF bool) (advance int, token []byte, err error)

ScanRunes是用于Scanner類型的分割函數(shù)(符合SplitFunc),本函數(shù)會(huì)將空白(參見(jiàn)unicode.IsSpace)分隔的片段(去掉前后空白后)作為一個(gè)token返回。本函數(shù)永遠(yuǎn)不會(huì)返回空字符串。用來(lái)找出 data 中的單行數(shù)據(jù)并返回(包括空行)

func ScanLines

func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error)

ScanLines是用于Scanner類型的分割函數(shù)(符合SplitFunc),本函數(shù)會(huì)將每一行文本去掉末尾的換行標(biāo)記作為一個(gè)token返回。返回的行可以是空字符串。換行標(biāo)記為一個(gè)可選的回車后跟一個(gè)必選的換行符。最后一行即使沒(méi)有換行符也會(huì)作為一個(gè)token返回。

type Scanner

type Scanner struct {
    r            io.Reader // The reader provided by the client.
    split        SplitFunc // The function to split the tokens.
    maxTokenSize int       // Maximum size of a token; modified by tests.
    token        []byte    // Last token returned by split.
    buf          []byte    // Buffer used as argument to split.
    start        int       // First non-processed byte in buf.
    end          int       // End of data in buf.
    err          error     // Sticky error.
}

Scanner類型提供了方便的讀取數(shù)據(jù)的接口,如從換行符分隔的文本里讀取每一行。成功調(diào)用的Scan方法會(huì)逐步提供文件的token,跳過(guò)token之間的字節(jié)。token由SplitFunc類型的分割函數(shù)指定;默認(rèn)的分割函數(shù)會(huì)將輸入分割為多個(gè)行,并去掉行尾的換行標(biāo)志。本包預(yù)定義的分割函數(shù)可以將文件分割為行、字節(jié)、unicode碼值、空白分隔的word。調(diào)用者可以定制自己的分割函數(shù)。掃描會(huì)在抵達(dá)輸入流結(jié)尾、遇到的第一個(gè)I/O錯(cuò)誤、token過(guò)大不能保存進(jìn)緩沖時(shí),不可恢復(fù)的停止。當(dāng)掃描停止后,當(dāng)前讀取位置可能會(huì)遠(yuǎn)在最后一個(gè)獲得的token后面。需要更多對(duì)錯(cuò)誤管理的控制或token很大,或必須從reader連續(xù)掃描的程序,應(yīng)使用bufio.Reader代替。

func NewScanner

func NewScanner(r io.Reader) *Scanner

NewScanner創(chuàng)建并返回一個(gè)從r讀取數(shù)據(jù)的Scanner,默認(rèn)的分割函數(shù)是ScanLines。

func (*Scanner) Split

func (s *Scanner) Split(split SplitFunc)

Split設(shè)置該Scanner的分割函數(shù)。本方法必須在Scan之前調(diào)用。

func main() {
   s := strings.NewReader("ABC DEF GHI JKL")
   bs := bufio.NewScanner(s)
   bs.Split(bufio.ScanWords)
   for bs.Scan() {
      fmt.Println(bs.Text())
   }
}

func (*Scanner) Scan

func (s *Scanner) Scan() bool

Scan方法獲取當(dāng)前位置的token(該token可以通過(guò)Bytes或Text方法獲得),并讓Scanner的掃描位置移動(dòng)到下一個(gè)token。當(dāng)掃描因?yàn)榈诌_(dá)輸入流結(jié)尾或者遇到錯(cuò)誤而停止時(shí),本方法會(huì)返回false。在Scan方法返回false后,Err方法將返回掃描時(shí)遇到的任何錯(cuò)誤;除非是io.EOF,此時(shí)Err會(huì)返回nil。

func main() {
    s := strings.NewReader("Hello 世界!")
    bs := bufio.NewScanner(s)
    bs.Split(bufio.ScanBytes)
    for bs.Scan() {
        fmt.Printf("%s ", bs.Text())
    }
}

func (*Scanner) Bytes

func (s *Scanner) Bytes() []byte

Bytes方法返回最近一次Scan調(diào)用生成的token。底層數(shù)組指向的數(shù)據(jù)可能會(huì)被下一次Scan的調(diào)用重寫。

func main() {
   s := strings.NewReader("Hello 世界!")
   bs := bufio.NewScanner(s)
   bs.Split(bufio.ScanRunes)
   for bs.Scan() {
      fmt.Printf("%s ", bs.Text())
   } 
}

func (*Scanner) Text

func (s *Scanner) Text() string

Bytes方法返回最近一次Scan調(diào)用生成的token,會(huì)申請(qǐng)創(chuàng)建一個(gè)字符串保存token并返回該字符串。

func (*Scanner) Err

func (s *Scanner) Err() error

Err返回Scanner遇到的第一個(gè)非EOF的錯(cuò)誤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容