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的一些坑