最近打算读一读 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

最新文章

  1. 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis
  2. 一次EF批量插入多表数据的性能优化经历
  3. .Net下几个服务框架介绍
  4. PHP 常用函数的解释
  5. OpenCV在VS2005下的配置
  6. 2016暑假多校联合---Death Sequence(递推、前向星)
  7. ASP.NET利用WINRar实现在线解压缩文件
  8. ms flexbox 布局 (ko list)
  9. poj2029Get Many Persimmon Trees(最大矩阵和)
  10. HttpServletRequest、request常用方法、request常见应用、请求转发、RequestDispatcher
  11. Linux Terminal 控制终端的使用
  12. HDU3518 后缀数组求不可重叠重复出现的不同子串个数
  13. Linux下的MySQL5.7.14启动方法
  14. ckeditor_配置 修改工具栏段落的标签和在文中的格式
  15. 【NLP】Attention Model(注意力模型)学习总结
  16. property用法
  17. JavaScript中关于页面URL地址的获取
  18. C++ virtual函数重写,在继承的时候没有在函数前写virtual关键字也依然是虚函数吗?
  19. JS或AS中处理ARGB、RGBA颜色值时要小心
  20. openwrt利用openvpn两网互通

热门文章

  1. kafka详解(04) - kafka监控 可视化工具
  2. Java类、对象以及(静态)方法的探讨
  3. 【架构设计】你真的理解软件设计中的SOLID原则吗?
  4. 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单
  5. Java:枚举类型
  6. 【分析笔记】LVGL v8.2.0 使用 freetype 概率性无显示的问题
  7. Debian11换源
  8. 亲测有效! Super PhotoCut Pro 超级抠图工具 V2.8.8 for mac 破解版
  9. H5商城项目源码 (可预览 测试有效)
  10. 有序数组的平方&amp;长度最小的子数组&amp;螺旋矩阵Ⅱ