Go圣经-学习笔记入门bufio.Scanner
cdh0805010 · · 10408 次点击 · · 开始浏览由bufio.Reader引出的问题
由上篇文章《Go圣经-学习笔记入门bufio》,我们可以知道,bufio.Reader结构体中所有读取数据的方法,都包含了delim分隔符,这个用起来很不方便,所以Google对此在go1.1版本中加入了bufio.Scanner结构体,用于读取数据。
使用DEMO:
func main(){
scanner:=bufio.NewScanner(
strings.NewReader("ABCDEFG\nHIJKELM"),
)
for scanner.Scan(){
fmt.Println(scanner.Text()) // scanner.Bytes()
}
}
理解:对于Scanner.Scan方法,相当于其他语言的迭代器iterator,并把迭代器指向的数据存放到新的缓冲区里。新的缓冲区(token)可以通过scanner.Text()或者scanner.Bytes()获取到。
Scanner.Scan方法默认是以换行符\n,作为分隔符。如果你想指定分隔符,Go语言提供了四种方法,ScanBytes(返回单个字节作为一个 token), ScanLines(返回一行文本), ScanRunes(返回单个 UTF-8 编码的 rune 作为一个 token)和ScanWords(返回通过"空格"分词的单词)。
使用方式:
func main(){
scanner:=bufio.NewScanner(
strings.NewReader("ABCDEFG\nHIJKELM"),
)
scanner.Split(ScanWords/*四种方式之一,你也可以自定义, 实现SplitFunc方法*/)
for scanner.Scan(){
fmt.Println(scanner.Text()) // scanner.Bytes()
}
}
结论:我们一般在读取数据到缓冲区时,且想要采用分隔符分隔数据流时,我们一般使用bufio.Scanner数据结构,而不使用bufio.Reader。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
由bufio.Reader引出的问题
由上篇文章《Go圣经-学习笔记入门bufio》,我们可以知道,bufio.Reader结构体中所有读取数据的方法,都包含了delim分隔符,这个用起来很不方便,所以Google对此在go1.1版本中加入了bufio.Scanner结构体,用于读取数据。
使用DEMO:
func main(){
scanner:=bufio.NewScanner(
strings.NewReader("ABCDEFG\nHIJKELM"),
)
for scanner.Scan(){
fmt.Println(scanner.Text()) // scanner.Bytes()
}
}
理解:对于Scanner.Scan方法,相当于其他语言的迭代器iterator,并把迭代器指向的数据存放到新的缓冲区里。新的缓冲区(token)可以通过scanner.Text()或者scanner.Bytes()获取到。
Scanner.Scan方法默认是以换行符\n,作为分隔符。如果你想指定分隔符,Go语言提供了四种方法,ScanBytes(返回单个字节作为一个 token), ScanLines(返回一行文本), ScanRunes(返回单个 UTF-8 编码的 rune 作为一个 token)和ScanWords(返回通过"空格"分词的单词)。
使用方式:
func main(){
scanner:=bufio.NewScanner(
strings.NewReader("ABCDEFG\nHIJKELM"),
)
scanner.Split(ScanWords/*四种方式之一,你也可以自定义, 实现SplitFunc方法*/)
for scanner.Scan(){
fmt.Println(scanner.Text()) // scanner.Bytes()
}
}
结论:我们一般在读取数据到缓冲区时,且想要采用分隔符分隔数据流时,我们一般使用bufio.Scanner数据结构,而不使用bufio.Reader。