程序
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
counts := make(map[string]int)
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
if input.Text() == "break" {
fmt.Println("break here")
break
}
counts[input.Text()]++
}
for line, n := range counts {
// fmt.Printf("%d\t%s\n", n, line)
if n > 1 {
fmt.Printf("%d\t%s\n", n, line)
}
}
}
使用make 创建类型
1、创建切片
var v := make([] int, 5)
2、创建map
counts := make(map[string] int)
3、创建管道
c = make(chan int )
构造组合类型
m := make([]map[string]int ,5)
fmt.Println(m) // [map[] map[] map[] map[] map[]]
for range 方式遍历map
go常用转义字符:
%d 整数类型
%x,%o, %b 16进制、8进制、2进制
%f,%g, %e 浮点数
%t 布尔型
%c 字符型
%s 字符串
%q 带引号字符串
%v 任意值
%T 任何值类型
%% 输出%
从多个文件中查找重复行
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.Println(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()]++
}
}
注意函数名、常量名、变量名首字母大小写:
go语言是根据大小写来确认访问权限的,大写说明为公有,小写为私有。
利用ioutil包处理多文件查重复行
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)
}
}
}
}