命令行参数
命令行参数以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)
}
}
}