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
posted @ 2017-10-09 19:46  bzt007  阅读(235)  评论(0编辑  收藏  举报