上次我們介紹了收集命令行參數的幾種方式,感覺還是不過癮,今天再來介紹一下如何從命令行接收用戶輸入。
我們這里設計一個小需求,借助程序從命令行收集用戶的逐行輸入,以 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
可以看出,上面代碼統計出了我們每一行輸入出現的次數,是不是很簡單呢。