本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。

在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用async-profiler剖析cpu性能,用jstack、jmap、arthas等来排查问题。
作为一名比较新的编程语言,golang的这些工具是否更加好用呢?

单元测试

Java的单元测试需要使用第三方库,一般是Junit,配置起来比较复杂。在使用了golang之后发现golang自带的单元测试真的非常简单。
如果我们有一个cal.go文件,那么其对应的单元测试文件为cal_test.go,其中的方法命名必须为TestXxx,这种按照命名进行单元测试的方式简单有效,也正是通常所说的“约定大于配置”。
来看一个简单的例子:

package unitfunc add(a int, b int) int {return a + b
}func sub(a int, b int) int {return a - b
}
package unitimport ("github.com/stretchr/testify/assert""testing"
)func TestAdd(t *testing.T) {assert.Equal(t, 10, add(5, 5))
}func TestSub(t *testing.T) {assert.Equal(t, 0, sub(5, 5))
}

执行单元测试只需要运行(更多用法参考go help test)

go test --cover cal_test.go cal.go -v

benchmark

和单元测试类似,golang的benchmark也是开箱即用。在cal_test.go基础上增加一个BenchmarkAdd方法

package unitimport ("github.com/stretchr/testify/assert""testing"
)func TestAdd(t *testing.T) {assert.Equal(t, 10, add(5, 5))
}func TestSub(t *testing.T) {assert.Equal(t, 0, sub(5, 5))
}func BenchmarkAdd(b *testing.B) {for i:= 0; i < b.N; i++ {add(5, 5)}
}

执行即可(更多用法参考go help test)

go test -bench=. -cpu=4 -count=3

pprof

pprof是golang自带的可以用来做cpu、内存、锁分析的工具,非常类似java的async-profiler。
pprof的使用非常简单,只需要在代码中引入net/http/pprof包,然后监听一个端口即可。
一个简单的例子如下:

package mainimport ("fmt""log""net/http""time"_ "net/http/pprof"
)func main() {go func() {//example: visit http://127.0.0.1:6060/debug/pprof in browser.err := http.ListenAndServe("0.0.0.0:6060", nil)if err != nil {fmt.Println("failed to start pprof goroutine:", err)}}()http.HandleFunc("/", handler)log.Fatal(http.ListenAndServe("localhost:8000", nil))
}func handler(w http.ResponseWriter, r *http.Request) {time.Sleep(1 * time.Second)eat()time := time.Now().Unix() * 2 + 1000000fmt.Fprintf(w, "URL.Path = %q; time = %d\n", r.URL.Path, time)
}func eat() {loop := 10000000000for i := 0; i < loop; i++ {// do nothing}
}

在命令行中输入

go tool pprof http://127.0.0.1:6060/debug/pprof/profile

同时不停的请求,让pprof能采集到数据,这里我的请求是

curl http://127.0.0.1:8000/hello

等待30秒后,采集结束会显示采集文件的地址

Saved profile in /Users/roshi/pprof/pprof.samples.cpu.003.pb.gz

此时可以使用top等命令直接查看cpu消耗过高的函数,更多命令可以使用help查看。

或者把文件下载下来用可视化的界面来分析,可以使用

go tool pprof -http=":8080" /User/roshi/pprof/pprof.samples.cpu.003.pb.gz

来开启一个可视化的页面,查看,如果报错需要安装graphviz,安装文档在这里可以查找:https://graphviz.gitlab.io/download/

访问 http://localhost:8080/ui/ 可以看到下图,其中面积最大的块表示消耗cpu最多

这里有一篇文章对pprof介绍的很仔细,可以参考:https://blog.wolfogre.com/posts/go-ppof-practice/

dlv

pprof很好用,但有一个缺点是必须事先在代码中开启,如果线上出问题且没有开启pprof,可能就需要类似jstack、jmap、arthas等这类工具来排查。这里推荐一个最近使用过非常好用的golang问题排查利器——dlv,项目地址见

https://github.com/go-delve/delve

它很有用的一个功能是attach,可以attach到正在运行的golang程序,查看goroutine。这点可以很好的排查线上问题。
各个平台的安装在github上写的很清楚,需要说明的是安装dlv的golang版本和要排查进程的golang版本需要保持一致。
先写一个测试程序,起两个goroutine,一个运行,一个阻塞

package mainimport ("fmt""sync"
)func main()  {go count()go wait()wait()
}func count()  {count := 0for {count = count + 1if count % 1000000000 == 0 {fmt.Println("I'm a running routine")}}
}func wait()  {wg := sync.WaitGroup{}wg.Add(1)wg.Wait()
}

运行起来,然后使用dlv进行attach,如下图(具体命令可以attach后使用help查看)

这样很方便地看到了各个goroutine在干啥

写在最后

作为一门比较新的编程语言,golang对现有语言取其精华,自带必要的工具,进一步降低门槛,对新手学习来说非常友好。


关于作者:专注后端的中间件开发,公众号"捉虫大师"作者,关注我,给你最纯粹的技术干货

盘点golang中的开发神器相关推荐

  1. 手游开发神器 cocos2d-x editor 教程聚合和代码下载(持续更新中)

    --------------游戏基础教程篇-------------已完成--------- 一 cocos2d-x editor工具下载和基础教程JS篇: 一 手游开发神器 cocos2d-x ed ...

  2. 盘点程序猿们离不开的开发神器,你拥有了多少?

    程序员小哥哥越来越被大家所熟知,当听到「程序员」这个词的时候,你脑海中第一反应到的是什么? 修电脑.闷骚.单身宅.没品位.无聊.死板,背心拖鞋大裤衩.脑袋不洗牙不刷,标配格子衬衫+牛仔裤+运动鞋?程序 ...

  3. BAT程序员们常用的开发神器

    BAT程序员们常用的开发神器 黄小斜 今天 作者丨InfoQ编辑部 工欲善其事必先利其器,一个优秀的程序员除了代码写得好,善于利用各种开发工具同样可以事半功倍.以 BAT 为代表的各大厂程序员们在平时 ...

  4. Java开发神器Lombok的使用与原理

    在面向对象编程中必不可少需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此.相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而需要重复 ...

  5. java lombok 视频_Java开发神器Lombok使用详解

    最近正在写SpringBoot系列文章和录制视频教程,每次都要重复写一些Getter/Setter.构造器方法.字符串输出的ToString方法和Equals/HashCode方法等.甚是浪费时间,也 ...

  6. webstorm+nodejs+JetBrains IDE Support+chrome打造前端开发神器

    #webstorm+nodejs+JetBrains IDE Support+chrome打造前端开发神器 -- 工欲善其事 必先利其器##各工具介绍 `webstorm`是**JetBrains** ...

  7. 很好很强大,这款AI开发神器的图像标注吊打labelme

    AI的发展有三大内核:数据.算法.算力.现如今,算法和算力在市面上的差距显然已经没有那么大,能够给AI提供充足弹药支持的当属数据了.深度学习算法精度的提升严重依赖于数据,谁的数据既多又准,谁的算法精度 ...

  8. Stark 组件:快速开发神器 —— 锦上添花

    Stark 组件:快速开发神器 -- 锦上添花 一.分页 二.排序 三.搜索 1.关键字搜索 2.组合搜索 四.批量操作 经过前面几个篇章,我们的 Stark 组件已经能够批量生成 URL,快速实现增 ...

  9. Stark 组件:快速开发神器 —— 页面显示

    说道 Stark 你是不是不会想到他--Tony Stark,超级英雄钢铁侠,这也是我的偶像. 不过我们今天要开发的 Stark 组件,倒是跟他的人工智能助手 JARVIS 有些类似,是帮助我们快速开 ...

最新文章

  1. struts文件上传
  2. P4048 [JSOI2010]冷冻波
  3. P3482 [POI2009]SLO-Elephants
  4. windows 2003下snort安装
  5. 三大电机控制方案之DSP篇(1):TMS320F28335
  6. 提交git push 的时候报错,Please make sure you have the correct access rights
  7. mysql的数据类型可分为哪两种_mysql数据类型分为哪几种
  8. python编程格式化输出_Python的三种格式化输出
  9. JDK源码(7)-Boolean
  10. static变量会被垃圾回收吗_废泡沫塑料属于哪种垃圾?废泡沫塑料是可回收垃圾吗?...
  11. java中的quartz_java 中对Quartz表达式的执行
  12. mysql数据库各项参数查询
  13. 大数据、云计算和物联网三者的关系
  14. Zynq-Linux移植学习笔记之57-国产ZYNQ PL挂载兆易创新GD25S512 flash
  15. 三星为Ativ S发布WP8更新
  16. MEM/MBA 写作-论证有效性分析(04)逻辑缺陷-偷换概念以偏概全
  17. cfd-post 流线很少
  18. Learning Image Conditioned Label Space for Multilabel Classification
  19. c#带参数调用存储过程
  20. 为淘宝的sdk模板安装java的JDK环境

热门文章

  1. 游戏引擎开发中常用的设计模式
  2. 2021年全球CT和PET扫描仪收入大约7229.4百万美元,预计2028年达到7883百万美元
  3. 端到端图像压缩《Asymmetric Gained Deep Image Compression With Continuous Rate Adaptation》
  4. 项目管理工具 web_管理Web项目的工具–最佳
  5. angular实现div盒子高度自适应
  6. oracle11g安装完成如何打开界面
  7. HTML+CSS简单复习
  8. 【node学习】node.js
  9. Android绘图实例(Bitmmap,Canvas,Pain的使用)动态的在图片上添加文字(canvas.drawText)
  10. vue 美团框架_GitHub - bxm0927/vue-meituan: 基于Vue 全家桶 (2.x)制作的美团外卖APP