- 前2节已经对 dup 做了深一步的解析, dup1 和 dup2都是以数据流的形式输入。理论上可以处理任意多行的输入数据,它是一步一步以数据流的方式读取数据。另外还可以一口气将数据全部读取到内存中,一次分割成多行,然后在处理
一、 dup3
运行路径:
$GOPATH/src/gopl/ch1/dup/
运行方式:
go run dup3.go input.txt
input.txt里面的数据全部读到内存后的处理结果:
二、程序分析
将文件中的数据全部读入在内存当中,调用 split 函数以 换行符 作为分割,然后依次处理。这个例子引入了ReadFile函数(来自于io/ioutil包),其读取指定文件的全部内容,strings.Split函数把字符串分割成子串的切片。(Split的作用与trings.Join相反。),由于ReadFile函数需要文件名作为参数,因此只读指定文件,不读标准输入。
package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
)
func main() {
counts := make(map[string]int)
for _, filename := range os.Args[1:] {
data, err := ioutil.ReadFile(filename)
if err != nil{
fmt.Fprintf(os.Stderr, "dup3:%v \n", err)
continue
}
for _, line := range strings.Split(string(data), "\n"){
counts[line]++
}
}
for line, n := range counts {
if n > 1 {
fmt.Printf("%d \t %s\n", n, line)
}
}
}
io/ioutil 包和strings 包
-
包 ioutil 提供了大量 IO 有关的函数,其中 ReadFile 提供将文件中的所有数据读取的内存中,返回二个参数,第一个是 []byte 的切片,第二个是内置 error 类型, 更多关于 ioutil 包的 API可以查看 golang 官网文档: https://golang.org/pkg/io/ioutil/
-
包 strings 提供了大量用于操作字符的简单函数,在源代码中 strings.Split(string(data), “\n”), 其中 string(data) 将 []byte的数据转化为 string 类型(类似于 C++ 的构造函数),在通过 Split 函数,以 “\n” 作为分割的标准, strings.Split(string(data), “\n”)函数返回 []string类型,更多关于 strings 包的 API可以查看 golang 官网文档: https://golang.org/pkg/strings
总结
- 熟悉 io/ioutil 包
- 学会查询 golang 官方文档: https://golang.org/pkg/