[日常] 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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函数创建的数据结构的引用,作为参数传递给某函数时相当于引用传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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包)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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) } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2016-04-02 [android] 多媒体播放api简介
2016-04-02 [android] 图片的缩放
2016-04-02 [android] 图片画画板
2016-04-02 [android] androidPN开源项目介绍
2016-04-02 [android] 安卓消息推送的几种实现方式
2016-04-02 [javaEE] HTTP协议总结