go 程序设计语言 命令行参数
最近打算读一读 go程序设计语言这本书, 读语言类的书是一件十分头疼的事情, 因为读一本书就意味着,看着一堆钳子 锥子工具的图片, 概念背了一大堆,仍然不知道怎么用,还是要通过实践。 还是习惯任务驱动的方式。 内容略读, 给自己提一些小的任务,逐渐提升,自认为是一件比较靠谱的学习方法。
练习 1.1 打印命令行的所有内容,包括命令本身的名字
这个练习的本意是想了解for循环的种类。 其实主要有两种,等我一会 把代码敲完ha。
5分钟后
别嫌弃简单了,可以说明问题的。 其实go 语言里面只有for循环, 你不用有其他的想法, 这个联系可以展示两种主要的。以这道题为例,一种是这种形式的:
s, sep := "", ""
for i := 0; i < len(os.Args); i++ {
s += sep + os.Args[i]
sep = " "
}
fmt.Println(s)
这种事比较传统的方式, 另一种是range
s, sep := "", ""
for _, arg := range os.Args {
s += sep + arg
sep = " "
}
里 面的_表示忽略其中的索引,由于go里面不允许使用无用的局部变量,所以一般返回值的不适用的话采取这种策略
其实虽然go只支持for循环,本人认为基本够用了.比如你要用while循环, for循环可以只保留条件变量,像下面的这种类似while的形式
for condition{
}
当然,死循环也是可以的,省略 for循环三个部分,像下面的样子
for{
}
现在可以给出可运行的代码了
package main
import (
"fmt"
"os"
)
func main() {
s, sep := "", ""
for _, arg := range os.Args {
s += sep + arg
sep = " "
}
fmt.Println(s)
}
练习 1.2 打印每个参数的索引和值。 这个就没啥意思了。写了, 咱看看下一个小题, 应该挺有意思
练习 1.3 做实验测量潜在低效的版本和使用了 strings.Join的版本的运行时间差异,所谓潜在低效版本就是程序用的这种操作符的形式。
好, 那我们就做个性能测试吧, 看看这两种方式相差是多少。 go语言自带的benchmark 测试工具, 不会的同学自行百度哈。等我一下,把程序敲完。
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
var arr [10000]string
for i := 0; i < 10000; i++ {
arr[i] = strconv.Itoa(i)
}
t1 := time.Now()
s := ""
for _, st := range arr {
s += st
}
elapsed := time.Since(t1)
fmt.Println("+ time : ", elapsed)
t2 := time.Now()
s2 := strings.Join(arr[0:], "")
elapsed2 := time.Since(t2)
fmt.Println("Join time:", elapsed2)
if s != s2 {
fmt.Println("error")
} else {
fmt.Println("sucess")
}
}
两种方式把10000个数字拼在一起,对比一下时间。
最后结果相差还是挺巨大的!!,看
- time : 78.96146ms
Join time: 73.106µs