「工具推薦」go-callvis
go-callvis是相對 以圖片的形式展示了go程序的調(diào)用關(guān)系,這個工具在看復(fù)雜項目時尤其有用。
親測,借助它看祖?zhèn)鱣olang代碼,頭痛好多了。
安裝
go get -u github.com/TrueFurby/go-callvis
# or
git clone https://github.com/TrueFurby/go-callvis.git
cd go-callvis && make install
運(yùn)行依賴
- Go 1.12+
- Graphviz:http://www.graphviz.org/download/ Mac 可以直接 brew install graphviz
項目地址:https://github.com/TrueFurby/go-callvis
使用命令
命令特別簡單,只需要簡單的輸入:
go-callvis [OPTIONS] <main package>
這里 main package 是包含代碼的main函數(shù)所在的包,比如項目 https://github.com/gusibi/oneplus/tree/master/idgenerator
目錄結(jié)構(gòu)為:
.
├── README.md
└── src
├── dbs
├── go.mod
├── go.sum
├── idg
│ ├── area_code.go
│ ├── idg.go
│ ├── idg_test.go
│ ├── index.go
│ ├── index_test.go
│ ├── sort.go
│ ├── sort_test.go
│ ├── wr.go
│ └── wr_test.go
├── main.go
└── sorteDB
其中src目錄是一個go package,運(yùn)行g(shù)o-callvis 時就需要先cd src/,然后再執(zhí)行命令:
go-callvis -group pkg,type md52id
md52id 是package name,已在go.mod中聲明,pakage name是一個必須要帶的參數(shù)。
運(yùn)行命令,默認(rèn)會打開瀏覽器加載地址http://localhost:7878
圖片格式為 svg,也可以添加 -format=png,指定以png形式展示
推薦使用svg,svg格式的內(nèi)容是可交互的,比如這里想查看gin包的內(nèi)容就可以點(diǎn)擊 對應(yīng)的模塊來看詳情。
結(jié)果如果所示,圖像展示的結(jié)果就是這個包所有的調(diào)用關(guān)系,按包的調(diào)用層級由左向右排列。第二列上邊是 gin 框架的代碼,如果看代碼時不想看這部分,可以使用 ignore 參數(shù)排除掉。
命令為:
go-callvis -group pkg,type -ignore github.com/gin-gonic/gin md52id
這里 gin 包的名字是 github.com/gin-gonic/gin而不是 gin
如果要再排出idg 包,可以直接加在gin 包后邊,用,(英文逗號)隔開。
使用limit 命令可以得到相同的結(jié)果
go-callvis -group pkg,type -limit md52id md52id
得到的結(jié)果為:
如果想看idg包內(nèi)部的調(diào)用關(guān)系,可以使用 focus 命令,指定idg 包,命令如下:
go-callvis -focus=md52id/idg -group pkg,type -limit md52id md52id
結(jié)果如圖: 詳細(xì)命令可以參考:https://github.com/TrueFurby/go-callvis/tree/master/examples
使用go-callvis ,直觀的展示代碼的調(diào)用關(guān)系,對于大項目的源碼尤其有用,比如下圖是gin stagic 包的調(diào)用關(guān)系:
通過圖可以直觀的看到,
- static 調(diào)用了 staticFS,而staticFS 只使用了 HEAD和GET 方法。
- 所有的http method 最終都是通過調(diào)用handler來處理響應(yīng)的。
### go-callvis 的另類用法
go-callvis 也可以用來評估系統(tǒng)設(shè)計是否合理,代碼是否清晰,下圖是docker 的調(diào)用圖:
原圖地址:http://media.gusibi.mobi/8vZ7dwD6bLOVUBecbWsC5ZMTDOSUeeLzRw2kfxL44TVO8BM0AFGHGzVO1iHJCFqd
可以看到,代碼結(jié)構(gòu)非常清晰,調(diào)用鏈也比較簡單,項目成功果然每一環(huán)都做的非常完美。
內(nèi)推
以下是shopee內(nèi)推廣告,「深圳、新加坡、上?!沟穆毼欢加校信d趣的可以留言或者識別二維碼直接投遞。
最后,感謝女朋友支持和包容,比??
也可以在公號輸入以下關(guān)鍵字獲取歷史文章:公號&小程序 | 設(shè)計模式 | 并發(fā)&協(xié)程
References
[1] go-callvis: https://github.com/TrueFurby/go-callvis
[2] Go: https://golang.org/dl/
[3] Graphviz:http://www.graphviz.org/download/: http://www.graphviz.org/download/
[4] 項目地址:https://github.com/TrueFurby/go-callvis: https://github.com/TrueFurby/go-callvis