《go语言圣经》练习答案--1.2. 命令行参数

练习 1.1: 修改echo程序,使其能够打印os.Args[0],即被执行命令本身的名字。

package main

import (
	"fmt"
	"os"
)

func main() {
	var s, sep string
	for i := 0; i < len(os.Args); i++ {
		s += sep + os.Args[i]
		sep = " "
	}
	fmt.Println(s)
}

练习 1.2: 修改echo程序,使其打印每个参数的索引和值,每个一行。

package main

import (
	"fmt"
	"os"
)

func main() {
	for i := 0; i < len(os.Args); i++ {
		fmt.Println(i, os.Args[i])
	}
}

练习 1.3: 做实验测量潜在低效的版本和使用了strings.Join的版本的运行时间差异。(1.6节讲解了部分time包,11.4节展示了如何写标准测试程序,以得到系统性的性能评测。)

使用基准测试

test.go

package main

import (
	"fmt"
	"strings"
)

func stringJoin() string {
	input := []string{"Welcome", "To", "China"}
	result := strings.Join(input, " ")
	return result
}

func stringPlus() string {
	input := []string{"Welcome", "To", "China"}
	var result, sep string
	for _, j := range input {
		result += sep + j
		sep = " "
	}
	return result
}

func main() {

}

t_test.go

package main

import (
	"testing"
)

func BenchmarkString2Join(b *testing.B) {
	for i := 0; i < b.N; i++ {
		stringJoin()
	}
}

func BenchmarkString2Plus(b *testing.B) {
	for i := 0; i < b.N; i++ {
		stringPlus()
	}
}

执行结果

goos: windows
goarch: amd64
pkg: hello
cpu: 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
BenchmarkString2Join
BenchmarkString2Join-16         40078419                30.53 ns/op
BenchmarkString2Plus
BenchmarkString2Plus-16         17557642                66.40 ns/op
PASS
使用 time 包
package main

import (
	"fmt"
	"strings"
	"time"
)

func timeCost() func() {
	start := time.Now()
	return func() {
		tc := time.Since(start)
		fmt.Printf("time cost = %v\n", tc)
	}
}

func stringJoin() string {
	defer timeCost()()
	input := []string{"Welcome", "To", "China"}
	result := strings.Join(input, " ")
	return result
}

func stringPlus() string {
	defer timeCost()()
	input := []string{"Welcome", "To", "China"}
	var result, sep string
	for _, j := range input {
		result += sep + j
		sep = " "
	}
	return result
}

func main() {
	stringJoin()
	stringPlus()
}

 

posted @ 2022-03-04 16:22  随风而逝的白色相簿  阅读(109)  评论(0编辑  收藏  举报