Golang: 接收命令行输入
上次我们介绍了收集命令行参数的几种方式,感觉还是不过瘾,今天再来介绍一下如何从命令行接收用户输入。
我们这里设计一个小需求,借助程序从命令行收集用户的逐行输入,以 bye
为结束信号,然后在输入结束后,统计每一行输入的内容和该内容出现的次数。
为了完成这个功能,我们首先需要创建一个 map
的数据结构,来存放每一行输入的内容和对应出现的次数,在 Go 语言中,我们可以使用 make(map[string]int)
这种方式创建所需的数据结构。
那么如何从标准输入流中接收数据呢,Go 语言提供了 bufio.NewScanner(os.Stdin)
这样的方式,它和 Java 中的 new Scanner(System.in)
颇为相似,都是在标准输入流上创建一个扫描对象,对命令行输入进行逐行扫描。
实现过程比较简单,我们来瞄一眼吧:
// scan.go
package main
import (
"os"
"fmt"
"bufio"
)
func main() {
// 创建一个map 指定key为string类型 val为int类型
counts := make(map[string]int)
// 从标准输入流中接收输入数据
input := bufio.NewScanner(os.Stdin)
fmt.Printf("Please type in something:\n")
// 逐行扫描
for input.Scan() {
line := input.Text()
// 输入bye时 结束
if line == "bye" {
break
}
// 更新key对应的val 新key对应的val是默认0值
counts[line]++
}
// 遍历map统计数据
for line, n := range counts {
fmt.Printf("%d : %s\n", n, line)
}
}
最后,我们运行程序,来看看结果:
$ go run scan.go
Please type in something:
hello
world
hello
bye
# 输出统计结果
2 : hello
1 : world
可以看出,上面代码统计出了我们每一行输入出现的次数,是不是很简单呢。
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2020/11/20 14:35