包是为了减少重复造轮子,为开发人员减少心智的设计,允许程序员开发公用包或者自己私用的包,减少重复的造轮子。测试也程序员面对的重大问题之一,从我以一个php程序员的角度来看,Go语言的测试工具的设计上也是完爆php,一个成熟的语言测试工具真的是必不可少的。

包和工具

  • Go一共有100多个标准包可以用下面命令来查看:
go list std | wc -l
  • Go 包编译的特点
    • 所有的包的导入都要在文件的开头声明,不需要分析整个代码直接编译特定包
    • 不允许有循环引入,实现一个有向五环图,加快编译速度,也可以实现单包并发编译
    • 编译后的目标文件不仅会导出信息,还记录了包的依赖关系,不需要遍历文件
  • 导入路径:都是用字符串表示,由构建起进行解析。
  • 包声明:在默认情况下导入包的包名是导入路径的最后一部分,但是也有特殊情况
    • main包和导入路径无关,主要是让go build 生成可执行文件
    • _test文件,构建器会忽略当前文件
    • 带有版本号的包,也会忽略版本号。
  • 导入声明可以单独import 也可以用()来包裹所有包,用换行还可以进行分组,分组中会按照顺序编译。
  • 包的匿名导入,如果包不被使用但被导入,编译时会产生错误,但有时候程序设计上需要根据参数导入不同的包,这个时候需要先导入才能使用,所以使用import _ “image/png” 匿名导入的方式,来实现程序功能。
  • 包的命名尽量简短,但也不要有歧义,最好拿最主要的实体命名
  • 工具:
    • 有瑞士军刀风格go hlep来看功能
    • 在构建之前,工程目录也是要先设置好的
    • go build 会将程序构建到工程目录的 bin 目录下
    • Go 有健全的文档机制,只要我们在导出的函数前,完成注释即可,第一行是摘要,保持简洁,后面的可以任意长度,如果过长也可以单独文件doc.go 文件。
    • godoc 可以生成也浏览的html 页面方便查询。

测试

  • 普通测试
    • _test.go 为文件名的文件,使用go test进行测试
  • 测试覆盖率
    • 覆盖率只是帮助找到代码脆弱的部分
    • go test -v -run=Coverage gopl.io/ch7/eval
  • 基准测试
    • Benchmark为前缀的
    • 测试一个程序在固定工作负载下的性能。
    • go test -bench=. -benchmem
  • 性能测试
    • 对于cpu 阻塞 和 内存的使用都可以用go test 进行测试。
        $ go test -cpuprofile=cpu.out
        $ go test -blockprofile=block.out
        $ go test -memprofile=mem.out
      

总结

Go 的包设计和工具的设计都是为了更好的方便程序员代码的开发和合理的利用,这种设计思想只有多年从事coder的人才能体会其中的妙用,测试也是解放了我们debug的时间,我觉得程序员都是懒的,只有懒才能触发我们的创造力,解放我们的时间,让我们有更多的时间做创造性的工作。