從標準輸入中讀取數據 1.if語句條件兩邊也不加括弧,但是主體部分需要加{} 2.map存儲了鍵/值(key/value)的集合,對集合元素,提供常數時間的存、取操作,map[string]int ==> key的類型string和value的類型int 3.內置函數make創建空map, coun ...
從標準輸入中讀取數據
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 main import ( "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 main import ( "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 main import ( "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) } } }