前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[日常] Go语言圣经-查找重复行

[日常] Go语言圣经-查找重复行

作者头像
唯一Chat
发布2019-09-10 12:29:09
1.1K0
发布2019-09-10 12:29:09
举报
文章被收录于专栏:陶士涵的菜地

从标准输入中读取数据

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

代码语言:javascript
复制
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函数创建的数据结构的引用,作为参数传递给某函数时相当于引用传递

代码语言:javascript
复制
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包)

代码语言:javascript
复制
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)
                }   
        }   
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档