zoukankan      html  css  js  c++  java
  • [日常] Go语言*-查找重复行

    从标准输入中读取数据

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

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

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

    4.bufioScanner类型读取输入并将其拆成行或单词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 	 %s 
    ", n, line)
                    }   
            }   
    }
    

      

    从文件中读取数据

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

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

    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 
    ", err)
                                    continue
                            }   
                            countLines(f, content)
                            //注意方法名的大小写
                            f.Close()
                    }   
            }   
            for line, n := range content {
                    if n > 1 { 
                            fmt.Printf("%d	%s
    ", 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 
    ", err)
                            continue
                    }   
                    msgs := strings.Split(string(data), "
    ")
                    for _, msg := range msgs {
                            content[msg]++
                    }   
            }   
            for line, n := range content {
                    if n > 1 { 
                            fmt.Printf("%d	%s
    ", n, line)
                    }   
            }   
    }
    

      

  • 相关阅读:
    vm扩容
    手算二维离散傅里叶变换
    取消vim模式匹配的高亮
    DS DI ES SI等等
    int and Integer
    为什么超类能引用子类的对象
    voltile解析
    java集合
    疑问:无限定通配符
    layui table 导出
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8698709.html
Copyright © 2011-2022 走看看