入门
- 命令行参数
- 找出重复行
- 常规版本
- 涉及文件操作
命令行参数
命令行参数以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) } }
}