我们在处理文件的时候,很多时候会需要解决文件拷贝、文件打印、文件搜索、文件排序、文件统计类这一类问题,这类程序通常会有比较相似的结构,一个处理输入的循环,在每一个输入元素上执行计算处理,在处理的同时或者处理完成之后进行结果输出。
首先我们来书写一个dup程序输出标准输入流中的出现多次的行,在行内容前是出现计数的次数。
package main
import(
"fmt"
"os"
"bufio"
)
func main(){
counts := make(map[string]int)
inputs := bufio.NewScanner(os.Stdin)
for input.Scan() {
counts[input.Text()]++
}
//暂时忽略处理输入的异常
for line, n := range counts {
if n > 1 {
fmt.Printf("%d%t%s\n", n, line)
}
}
}
在这里程序运行后,输入字符串内容,但是这里并不会自动结束,需要手动输入EOF,Linux下是键入Ctrl + D,Windows下是Ctrl + Z。然后程序才会执行至下一步。
Go语言和其他C系列语言有很多不一样的地方,比如if和for后面不必写括号,但是花括号的左半部分不能换行,这是强制的,否则无法编译通过。
map是Go语言内置的key/value型数据结构,这个数据结构能提供常数时间的存取操作。
与Go语言的其他内置类型一样,不用担心未初始化的问题,编译器会自动将其初始化为0或者空字符串。
程序中用到了bufio的package,主要的目的是帮助我们更方便有效地处理程序的输入和输出。这个包最有用的一个特性是Scanner类型,可以简单实现接收输入,或把输入打散成行或者单词。