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ò)誤。