GO源代码分析技能

148 阅读4分钟

一、概述

image.png     要学好一门语言,分析研究此语言的各类的源码是一条必经之路,故此篇重点讲解我们如何对GO源码代码进行分析,希望读者能从中受益。此篇不会去讲很具体的Golang源码结构,此文只授之以渔.

二、依赖分析

    分析源码通常一个比较好的思路:先从宏观对系统内部模块的调用关系有一个整体的认识。这个过程又分静态分析和动态分析。动态分析很简单,直接对内存数据进行采样即可,比如 Golang 的 pprof,动态分析依赖于流量,或者说访问数据,不同的访问数据往往会造成不同的调用关系。

    静态分析的话现在市面上也有很多好用的开源工具,我们今天看一下 Golang 的代码静态依赖分析怎么做。Golang 静态分析尤其简单,为什么?Golang 语法方面,我们调用一个 package 的时候,需要 import。同时,如果我们代码中对一个 package 没有引用而又把包 import 进来,这个时候 Golang 的编译器是会报错的。这两点意味着我们可以通过分析 import 语句块来得到包内部的调用关系。本文将介绍三种手段。

2.1 GoPlantUml

    在介绍GoPlantUml之前,我们需要介绍下PlantUML.PlantUML 是一个开源项目,诞生于 2009 年,支持快速绘制时序图、用例图、类图、活动图、组件图、状态图、对象图、部署图等。同时还支持非 UML 图的甘特图、架构图等。

    PlantUML 类似于HTML的标记性语言,采用graphviz来渲染PlantUML,可集成在markdown。故而可以像维护代码一样维护 UML 图的历史版本,编写脚本就会自动生成UML图。用于会议讨论、流程设计、需求编写等环节。

    VsCode Goland均提供了对应的插件进行编写和预览,另外可以直接在线 www.plantuml.com/ 生成。

image.png (VsCode使用Plantuml时,代码的文件的扩展名可以如一下:*.wsd, *.pu, *.puml, *.plantuml, *.iuml 按Alt+D或者Option+D可预览生成的图表,注意如果你的电脑上没有安装java则需要先进行安装。

    接下来我们以分析ast包为例来说明如何使用goplantuml.具体的各类参数,大家看自行阅读,这里不再赘述。,

  • 下载goplantuml:地址
  • 向golantuml需要分析包的位置,得到最终的plantuml文件,如
    goplantuml.exe G:\go\src\go\ast >ast.puml
  • 用vscode打开ast.puml,按下alt+D即可预览,效果图如下
  • 也可将ast.puml的内容放到www.plantuml.com站点中进行预览

image.png

2.2 dumels

dumels是一个站点(在线地址),它整合了goplantuml的功能,可直接在线使用,你只要给它一个golang包的url路径即可生成代码里面的依赖引用关系。下图以go-redis在github中的路径为例,点击生成即可得到一张依赖图,和上图看到的类似,所以这应该可以足够方便于我们日常开发中各类包的内部关系查看。

image.png

image.png

2.3 sourcegraph

我们有时候手动分析源代码,我们不得不放到IDE里面,但有时候代码很大,而github上我们无法进行代码方便的阅读,如代码的跳转和引用等,所以这里我们推荐使用sourcegraph,很多优秀的项目都会托管在github上,但是每次阅读都需要下载非常麻烦,最近接触源码阅读神器sourcegraph瞬间感觉人生亮了起来。

  1. 安装:从Google商店下载sourcegraph,其他安装方式:地址

  2. 安装后,点击任意github项目中的星状图标即可进入

image.png

2.4.AI

有时候找代码不知道在哪里,搜索引擎也不着调,但AI可以,这里不多说,读者可以自己去体会下。希望本文对大家学习GO源码代码分析有所帮助,后续我们会提供更多的分析手段,请继续关注

image.png

image.png