第1章 入门
1.3 查找重复的行
在1.2节,我们简单的了解了一些Go语言的基本语法,接下来我们再来看一个例子进一步学习
对文件做拷贝、打印、搜索和排序、统计或类似事情的程序都有一个差不多的程序结构:一个处理输入的循环,再每个元素上执行计算处理,在处理的同时或最后产生输出。我们来通过一些案例深入理解下这种程序结构
case 1:
func main() {
counts := make(map[string]int)
input:= 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)
}
}
}
1)定义一个map类型的变量,map是一个存储了键/值得集合,其中键和值都可以是任意类型,这里创建map使用内置的make函数。map类型在后面我们还会讲到
counts := make(map[string]int)
2)第二个变量input是通过bufio包下的NewScanner函数定义的,我们来对这个函数进行剥洋葱式的了解一下
input:= bufio.NewScanner(os.Stdin)
NewScanner函数有一个参数r,类型是io.Reader,同时返回值是*Scanner, 通过查看函数体我们发现它是一个结构体的引用(当某个变量本身很大,不方便传递时,我们往往选择用指针进行引用而不是直接传递这个变量)
func NewScanner(r io.Reader) *Scanner {
return &Scanner{
r: r,
split: ScanLines,
maxTokenSize: MaxScanTokenSize,
}
}
让我们继续,io.Reader不是一个基础数据/符合数据类型其它非自定义类型,所以我们