日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

盘点golang中的开发神器

發布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 盘点golang中的开发神器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文已收錄 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中的开发神器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。