从标准输入中读取数据

1.if语句条件两边也不加括号,但是主体部分需要加{}

2.map存储了键/值(key/value)的集合,对集合元素,提供常数时间的存、取操作,map[string]int ==> key的类型string和value的类型int

3.内置函数make创建空map, counts := make(map[string]int)

4.bufio包Scanner类型读取输入并将其拆成行或单词input := bufio.NewScanner(os.Stdin) 短变量声明一个input变量

5.调用input.Scan(),读入下一行,在读到一行时返回true,不再有输入时返回false

6.fmt.Printf函数对一些表达式产生格式化输出

注意:

go语言中的input.Scan() 停止输入是

EOF

终端情况下请使用 ctrl+d

文件的是直接

cat input | go run main.go

dup1,go

package main

import (
"bufio"
"fmt"
"os"
) func main() {
content := make(map[string]int)
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
content[input.Text()]++
}
for line, n := range content {
if n >= 1 {
fmt.Printf("%d \t %s \n", n, line)
}
}
}

  

从文件中读取数据

1.os.Open函数返回两个值。第一个值是被打开的文件(*os.File)

2.os.Open返回的第二个值是内置error类型的值,如果不等于内置值nil(NULL)说明出错了

3.使用fmt.Fprintf表示打印任意类型默认格式值的动词%v

4.map是一个由make函数创建的数据结构的引用,作为参数传递给某函数时相当于引用传递

package main

import (
"bufio"
"fmt"
"os"
) func main() {
content := make(map[string]int)
files := os.Args[1:] //获取命令行参数里的文件路径
if len(files) == 0 {
//从标准输入中读取数据
countLines(os.Stdin, content)
} else {
//从文件中读取数据
//如果有多个文件
for _, path := range files {
f, err := os.Open(path) //读取文件
//读取出错
if err != nil {
fmt.Fprintf(os.Stderr, "dup2:%v \n", err)
continue
}
countLines(f, content)
//注意方法名的大小写
f.Close()
}
}
for line, n := range content {
if n > 1 {
fmt.Printf("%d\t%s\n", n, line)
}
}
} //声明一个函数,实参类型:*os.File,content map[string]int
func countLines(f *os.File, content map[string]int) {
input := bufio.NewScanner(f)
for input.Scan() {
content[input.Text()]++
}
}
~

  

一口气把全部输入数据读到内存中,一次分割为多行,然后处理它们

1.ReadFile函数(来自于io/ioutil包),其读取指定文件的全部内容,返回一个字节切片(byte slice),必须把它转换为string

2.strings.Split函数把字符串分割成子串的切片(来自于strings包)

package main

import (
"fmt"
"io/ioutil"
"os"
"strings"
) func main() {
content := make(map[string]int)
files := os.Args[1:] //获取命令行参数里的文件路径
//从文件中读取数据
//如果有多个文件
for _, path := range files {
data, err := ioutil.ReadFile(path) //读取文件
//读取出错
if err != nil {
fmt.Fprintf(os.Stderr, "dup3:%v \n", err)
continue
}
msgs := strings.Split(string(data), "\n")
for _, msg := range msgs {
content[msg]++
}
}
for line, n := range content {
if n > 1 {
fmt.Printf("%d\t%s\n", n, line)
}
}
}

  

[日常] Go语言圣经-查找重复行的更多相关文章

  1. linux shell脚本查找重复行/查找非重复行/去除重复行/重复行统计

    转自:http://blog.sina.com.cn/s/blog_6797a6700101pdm7.html 去除重复行 sort file |uniq 查找非重复行 sort file |uniq ...

  2. Sublime文本排序&查找重复行&删除重复行

    排序 按F9或者选择菜单:Edit > Sort Lines,对每行文本进行排序 查找重复行 排序好后,按Ctrl+F,调出查找面板 查找字符串: ^(.+)$[\r\n](^\1$[\r\n] ...

  3. [日常] Go语言圣经--接口约定习题

    Go语言圣经-接口1.接口类型是对其它类型行为的抽象和概括2.Go语言中接口类型的独特之处在于它是满足隐式实现的3.Go语言中还存在着另外一种类型:接口类型.接口类型是一种抽象的类型4.一个类型可以自 ...

  4. [日常] Go语言圣经-错误,函数值习题

    Go语言圣经-错误 1.panic异常.panic是来自被调函数的信号,表示发生了某个已知的bug 2.任何进行I/O操作的函数都会面临出现错误的可能 3.错误是软件包API和应用程序用户界面的一个重 ...

  5. [日常] Go语言圣经--结构体,JSON习题

    Go语言圣经-结构体 1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体 2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行 ...

  6. [日常] Go语言圣经--复合数据类型,数组习题

    go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...

  7. [日常] Go语言圣经--复数,布尔值,字符串习题

    go语言圣经-复数 1.我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位.两种精度的复数类型:complex64和complex128,分别对应float3 ...

  8. [日常] Go语言圣经--作用域,基础数据类型,整型

    go语言圣经-作用域 1.一个声明语句将程序中的实体和一个名字关联,比如一个函数或一个变量 2.一个变量的生命周期是指程序运行时变量存在的有效时间段;声明语句的作用域对应的是一个源代码的文本区域,它是 ...

  9. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明的名 ...

随机推荐

  1. c# 锁 Interlocked 操作

    //定义原子变量 ; //原子级别+1值,如果>=0,说明当前锁为空,可以执行,避免重复执行 ) { if (_serverThread == null || (_serverThread.Is ...

  2. Stack-682. Baseball Game

    You're now a baseball game point recorder. Given a list of strings, each string can be one of the 4 ...

  3. Retrofit源码解析(上)

    简介Retrofit是Square公司开发的一款针对Android网络请求的框架,官网地址http://square.github.io/retrofit/ ,在官网上有这样的一句话介绍retrofi ...

  4. 这几天bug多,自我检讨一下

    这段时间(主要指4月底到5月初)写的bug超过以往总和,觉得很有必要停一下,找找原因.所谓前车之鉴后车之师,不能也不应该在同一地方跌倒N次吧: 为什么bug频出? 深究原因,并不是代码量大.功能多,反 ...

  5. Sql Sever 2012数据库更名失败 error:5030

    打开SQL Server 2012数据库时,对HzWind_2MW数据库名修改为HzWind_2MW_GEM,结果出现如图1所示: 图1 数据库更名时出现error:5030 数据库不能重名名5030 ...

  6. 七:MyBatis学习总结(七)——Mybatis缓存

    ---恢复内容开始--- 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地 ...

  7. linux文件系统底层原理

    Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中. 底层原理图: 在讲解各个 ...

  8. 【12】JMicro微服务-Zookeeper

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统 ...

  9. Monkey学习笔记<三>:Monkey脚本编写

    我们都知道Monkey是向手机发送伪随机事件流,但是有时候我们需要实现特定的事件流,这时候我们可以用Monkey脚本来实现. 通过对monkey的API研究发现,我们可以通过-f这个参数来实现monk ...

  10. JavaScript 函数定义方法

    JavaScript 函数定义方法. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function functionName(parameters) { 执行的代码 } 函数声明后不会立 ...