Scanner in Golang
scanner
类型提供了很多方法,这些方法可以用来方便地处理以 newline 为结尾的文件。我们
可以用 bufio
package 的方法 NewScanner
来创建一个 scanner 类型的实体,然后用 scanner
的方法 Scan()
去扫描该文件。Scan()
用来在文件中找 token,每找到一个 token,你就可以
用 Text()
方法来获得从本次扫描开始到这个 token 的位置的字符内容。这个 token 可以用 splitFunc 类型的
函数定义,默认为 newline。
下面我们来看一个例子,用 scanner
来实现一个 UINX 的经典程序 cat
:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
if len(os.Args) == 1 {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text()) // Println will add back the final '\n'
}
if err := scanner.Err(); err != nil {
fmt.Fprintf(os.Stderr, "reading stand input: %v\n", err)
}
} else {
for _, arg := range os.Args[1:] {
file, err := os.Open(arg)
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
continue
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text()) // Println will add back the final '\n'
}
if err := scanner.Err(); err != nil {
fmt.Fprintf(os.Stderr, "reading stand input: %v\n", err)
}
}
}
}
以上。