[日常] Go语言圣经-查找重复行
从标准输入中读取数据
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语言圣经-查找重复行的更多相关文章
- linux shell脚本查找重复行/查找非重复行/去除重复行/重复行统计
转自:http://blog.sina.com.cn/s/blog_6797a6700101pdm7.html 去除重复行 sort file |uniq 查找非重复行 sort file |uniq ...
- Sublime文本排序&查找重复行&删除重复行
排序 按F9或者选择菜单:Edit > Sort Lines,对每行文本进行排序 查找重复行 排序好后,按Ctrl+F,调出查找面板 查找字符串: ^(.+)$[\r\n](^\1$[\r\n] ...
- [日常] Go语言圣经--接口约定习题
Go语言圣经-接口1.接口类型是对其它类型行为的抽象和概括2.Go语言中接口类型的独特之处在于它是满足隐式实现的3.Go语言中还存在着另外一种类型:接口类型.接口类型是一种抽象的类型4.一个类型可以自 ...
- [日常] Go语言圣经-错误,函数值习题
Go语言圣经-错误 1.panic异常.panic是来自被调函数的信号,表示发生了某个已知的bug 2.任何进行I/O操作的函数都会面临出现错误的可能 3.错误是软件包API和应用程序用户界面的一个重 ...
- [日常] Go语言圣经--结构体,JSON习题
Go语言圣经-结构体 1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体 2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行 ...
- [日常] Go语言圣经--复合数据类型,数组习题
go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...
- [日常] Go语言圣经--复数,布尔值,字符串习题
go语言圣经-复数 1.我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位.两种精度的复数类型:complex64和complex128,分别对应float3 ...
- [日常] Go语言圣经--作用域,基础数据类型,整型
go语言圣经-作用域 1.一个声明语句将程序中的实体和一个名字关联,比如一个函数或一个变量 2.一个变量的生命周期是指程序运行时变量存在的有效时间段;声明语句的作用域对应的是一个源代码的文本区域,它是 ...
- [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题
go语言圣经-声明1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明的名 ...
随机推荐
- c# 锁 Interlocked 操作
//定义原子变量 ; //原子级别+1值,如果>=0,说明当前锁为空,可以执行,避免重复执行 ) { if (_serverThread == null || (_serverThread.Is ...
- 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 ...
- Retrofit源码解析(上)
简介Retrofit是Square公司开发的一款针对Android网络请求的框架,官网地址http://square.github.io/retrofit/ ,在官网上有这样的一句话介绍retrofi ...
- 这几天bug多,自我检讨一下
这段时间(主要指4月底到5月初)写的bug超过以往总和,觉得很有必要停一下,找找原因.所谓前车之鉴后车之师,不能也不应该在同一地方跌倒N次吧: 为什么bug频出? 深究原因,并不是代码量大.功能多,反 ...
- Sql Sever 2012数据库更名失败 error:5030
打开SQL Server 2012数据库时,对HzWind_2MW数据库名修改为HzWind_2MW_GEM,结果出现如图1所示: 图1 数据库更名时出现error:5030 数据库不能重名名5030 ...
- 七:MyBatis学习总结(七)——Mybatis缓存
---恢复内容开始--- 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地 ...
- linux文件系统底层原理
Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中. 底层原理图: 在讲解各个 ...
- 【12】JMicro微服务-Zookeeper
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统 ...
- Monkey学习笔记<三>:Monkey脚本编写
我们都知道Monkey是向手机发送伪随机事件流,但是有时候我们需要实现特定的事件流,这时候我们可以用Monkey脚本来实现. 通过对monkey的API研究发现,我们可以通过-f这个参数来实现monk ...
- JavaScript 函数定义方法
JavaScript 函数定义方法. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function functionName(parameters) { 执行的代码 } 函数声明后不会立 ...