从标准输入中读取数据
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
package mainimport ("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函数创建的数据结构的引用,作为参数传递给某函数时相当于引用传递
package mainimport ("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包)
package mainimport ("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)} } }