代码:
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)
}
}
}
功能:一口气把全部输入数据读到内存中,一次分割为多行,然后处理它们。
代码解析:
data, err := ioutil.ReadFile(filename)
使用Go语言中的ioutil
包来读取文件内容并将其存储在data
变量中。ReadFile
函数接受一个文件名作为参数,并返回文件的内容和一个错误对象。如果读取文件成功,data
变量将包含文件的内容,否则将返回一个非空的错误对象err
,其中包含有关读取失败的详细信息。
for _, line := range strings.Split(string(data), "\n")
这段代码使用range
循环遍历strings.Split(string(data), "\n")
的结果。首先,string(data)
将字节切片data
转换为字符串类型。然后,strings.Split(string(data), "\n")
将字符串按照换行符("\n"
)进行分割,返回一个字符串切片,其中每个元素都是原始字符串中的一行。在range
循环中,使用_
来忽略索引值,而line
则是每次迭代中的当前行内容。循环将依次遍历字符串切片中的每一行,并执行相应的操作。
运行结果