func Practice01() {
/*
练习 1.1: 修改echo程序,使其能够打印os.Args[0],即被执行命令本身的名字。
练习 1.2: 修改echo程序,使其打印每个参数的索引和值,每个一行。
练习 1.3: 做实验测量潜在低效的版本和使用了strings.Join的版本的运行时间差异。(1.6节讲解了部分time包,11.4节展示了如何写标准测试程序,以得到系统性的性能评测。)
*/
fmt.Println("练习 1.1:")
fmt.Println(strings.Join(os.Args[0:], " "))
fmt.Println("练习 1.2:")
for index, arg := range os.Args[1:] {
fmt.Printf("args[%d]=%s\n", index, arg)
}
fmt.Println("练习 1.3:")
//构造一个字符串的slice
var numSlice []string
numSlice = make([]string, 10)
for i := 1; i <= 100000; i++ {
numSlice = append(numSlice, strconv.Itoa(i))
}
start1 := time.Now().Unix()
_ = strings.Join(numSlice, " ")
fmt.Printf("使用Join花费时间:%ds\n", time.Now().Unix()-start1)
var s, sep string
start2 := time.Now().Unix()
for i := 0; i < len(numSlice); i++ {
s += sep + numSlice[i]
sep = " "
}
fmt.Printf("是用+=花费时间:%ds\n", time.Now().Unix()-start2)
}
func Practice02() {
/*
练习 1.4: 修改dup2,出现重复的行时打印文件名称。
*/
counts := make(map[string]int)
files := os.Args[1:]
if len(files) == 0 {
countLines(os.Stdin, counts)
} else {
for _, arg := range files {
f, err := os.Open(arg)
if err != nil {
fmt.Fprintf(os.Stderr, "dup2:%v\n", err)
continue
}
countLines(f, counts, arg)
f.Close()
}
}
for line, n := range counts {
//只显示个数大于等于1
if n > 1 {
fmt.Printf("%d\t%s\n", n, line)
}
}
}
func countLines(f *os.File, counts map[string]int, arg string) {
input := bufio.NewScanner(f)
for input.Scan() {
if input.Text() == "exit" {
break
}
counts[input.Text()]++
if counts[input.Text()] > 1 {
fmt.Println(arg)
}
}
}