首页  

go程序设计语言01_03入门之查找重复的行     所属分类 go 浏览量 826
文件读写操作  
拷贝 打印 搜索 排序 统计

打印标准输入中各行的出现次数

dup1

// Dup1 prints the text of each line that appears more than
// once in the standard input, preceded by its count.
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    counts := make(map[string]int)
    input := bufio.NewScanner(os.Stdin)
    for input.Scan() {
        if(input.Text()=="q"){
          break;
        }
        counts[input.Text()]++
    }
    // NOTE: ignoring potential errors from input.Err()
    for line, n := range counts {
        if n > 1 {
            fmt.Printf("%d\t%s\n", n, line)
        }
    }
}

map 键/值(key/value)集合
键可以是任意类型,只要其值能用==运算符比较,最常见的例子是字符串 ,值则可以是任意类型

counts[input.Text()]++ 

line := input.Text()
counts[line] = counts[line] + 1

counts[line]  键值不存在时 返回零值  int 零值为 0

基于range的循环
每次迭代得到两个结果,键和对应的值
map的迭代顺序不确定,每次运行都会变化

bufio包  输入和输出处理

input.Scan() 读入下一行,并移除行末的换行符

fmt.Printf 格式化输出

%d          十进制整数
%x, %o, %b  十六进制,八进制,二进制整数
%f, %g, %e  浮点数: 3.141593 3.141592653589793 3.141593e+00
%t          布尔:true或false
%c          字符(rune) (Unicode码点)
%s          字符串
%q          带双引号的字符串"abc"或带单引号的字符'c'
%v          变量的自然形式(natural format)
%T          变量的类型
%%          字面上的百分号标志(无操作数)

转义字符 escape sequences


从一系列具名文件中读取数据 dup2 package main import ( "bufio" "fmt" "os" ) func main() { counts := make(map[string]int) files := os.Args[1:] if len(files) == 0 { countLines(os.Stdin, counts) } else { for _, arg := range files { f, err := os.Open(arg) if err != nil { fmt.Fprintf(os.Stderr, "dup2: %v\n", err) continue } countLines(f, counts) f.Close() } } for line, n := range counts { if n > 1 { fmt.Printf("%d\t%s\n", n, line) } } } func countLines(f *os.File, counts map[string]int) { input := bufio.NewScanner(f) for input.Scan() { counts[input.Text()]++ } // NOTE: ignoring potential errors from input.Err() } go run dup2.go 01.txt 02.txt os.Open函数返回两个值 被打开的文件(*os.File) error nil表示打开成功 input.Scan读取文件 counts := make(map[string]int)
dup3 package main import ( "fmt" "io/ioutil" "os" "strings" ) func main() { counts := make(map[string]int) for _, filename := range os.Args[1:] { data, err := ioutil.ReadFile(filename) if err != nil { fmt.Fprintf(os.Stderr, "dup3: %v\n", err) continue } for _, line := range strings.Split(string(data), "\n") { counts[line]++ } } for line, n := range counts { if n > 1 { fmt.Printf("%d\t%s\n", n, line) } } } go run dup3.go 01.txt 02.txt ReadFile函数字节切片(byte slice),转换为string,然后用strings.Split分割

上一篇     下一篇
C程序设计语言笔记_01_入门

C程序设计语言笔记_02_类型运算符与表达式

python Simple HTTP Server

HikariCP为什么这么快

Spring事务失效的原因

Lombok的一些坑