Go bufio库
bufio.Scanner
bufio
包使处理输入和输出方便又高效。Scanner
类型是该包最有用的特性之一,它读取输入并将其拆成行或单词;通常是处理行形式的输入最简单的方法。该变量从程序的标准输入中读取内容。每次调用input.Scanner
,即读入下一行,并移除行末的换行符;读取的内容可以调用input.Text()
得到。Scan
函数在读到一行时返回true
,在无输入时返回false
。
使用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。
NewScanner 和 NewReader 读取文件内容
newScanner读取文件
func printFile(filename string) { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println("scanner", scanner.Text()) } }
newReader读取文件
func printFile (filename string) { file, err := os.Open(filename) defer file.Close() if err != nil { panic(err) } reader := bufio.NewReader(file) for { line, _, err := reader.ReadLine() if err != nil || err == io.EOF { break } else { fmt.Printf("the line content is : %s\n", line) } } }