Go程序设计语言 练习题

练习1.1:修改echo程序输出os.Args[0],即命令的名字。

package main

import (
    "fmt"
    "os"
)

func main(){
    if len(os.Args) > 0 {
        fmt.Println(os.Args[0])
    }
}

运行:go run main.go args args2

输出:

/var/folders/w1/vvlknvm10l3b8391hzltdh0h0000gn/T/go-build287366431/b001/exe/main

练习1.2:修改echo程序,输出参数的索引和值,每行一个。

package main

import (
	"fmt"
	"os"
)

func main(){
	for k,value := range os.Args{
		fmt.Println(k)
		fmt.Println(value)
	}
}

运行:go run main.go args args2

输出:

0
/var/folders/w1/vvlknvm10l3b8391hzltdh0h0000gn/T/go-build005548217/b001/exe/main
1
args=1
2
args2

练习1.3:尝试测量可能低效的程序和使用strings.Join的程序在执行时间上的差异。(1.6节有time包,11.4节展示如何撰写系统性的性能评估测试。)

未做

练习1.4: 修改dup2程序,输出出现重复行的文件的名称。

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main(){
	files := os.Args[1:]
	if len(files) == 0 {
		return
	}

	var result []string
	for _, arg := range files{
		f, err := os.Open(arg)
		if err != nil{
			fmt.Fprintf(os.Stderr, "dup2: %v\n", err)
			continue
		}
		counts := make(map[string]int)
		countLines(f, counts)
		f.Close()
		for _,v := range counts{
			if v > 1 {
				result = append(result,arg)
				break;
			}
		}
	}
	fmt.Println(strings.Join(result," "))
}

func countLines(f *os.File, counts map[string]int){
	input := bufio.NewScanner(f)
	for input.Scan(){
		counts[input.Text()]++
	}
}

$ go run main.go file1.txt file2.txt file3.txt
file1.txt file3.txt

 

 

你可能感兴趣的:(go)