入門
- 命令行參數
- 找出重復行
- 常規版本
- 涉及文件操作
命令行參數
命令行參數以os
包中Args
名字的變量供程序訪問,在os
包外面,使用os.Args
這個名字
- 變量
os.Args
是一個字符串slice
os.Args[0]
:命令本身的名字os.Args[1:]
:另外的元素,是程序開始執行時的參數
package main import ( "fmt" "os" "strings"
) func main() { //輸出命令行名字 fmt.Println(os.Args[0]) s, sep := "", "" // 每一次迭代,range產生一對值:索引和這個索引處元素的值 for _, arg := range os.Args[1:] { s += sep + arg sep = " " } fmt.Println(s) fmt.Println(strings.Join(os.Args[1:], ", "))
}
- 空標識符
_
:可以用在任何語法需要變量名但是邏輯不需要的地方
找出重復行
常規版本
// dup 輸出標準輸入中出現次數大于1的行,前面是次數
package main import ( "bufio" "fmt" "os"
) func main() { counts := make(map[string]int) input := bufio.NewScanner(os.Stdin) for input.Scan() { counts[input.Text()]++ } for line, n := range counts { if n > 1 { fmt.Printf("%d: %s\n", n, line) } }
}
涉及文件操作
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, "dup2: %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: %s\n", n, line) } }
}