Go项目源码阅读小技巧

3,664 阅读3分钟

文章首发于公众号【程序员读书】,欢迎关注。

前言

老实说,我觉得提升编程能力最重要的方法就是去阅读那些优秀开源项目代码。

在阅读代码的过程中,我们可以学习到优秀的设计思想、编程规范与编程思维。

优秀的代码阅读多了,再多多思考与模仿,假以时日,自己也能写出一手漂亮的代码。

谈到优秀开源项目的源码,作为一名Go开发者,我们可以阅读Go标准库和优秀第三方库的代码。

很多开发者都是从其他编程语言转为Go开发的,因此常常用其他编程语言的习惯去写Go代码,这样写出来的代码就很不符合Go编程规范与哲学,而阅读Go标准库或优秀第三方库的源码,可以让我们学到如何写出地道Go代码。

源码阅读原则

  1. 不要纠结代码细节,要对所阅读的项目有全局整体的认识。
  2. 阅读README.md文档,优秀的开源项目都有README.MD文档,通过阅读这种文档,让我们对项目是什么,能做什么,怎么用有一个整体的认识。
  3. 在使用与调试中去验证自己的理解。
  4. 用思维导图可以更好帮我们记录代码的执行流程。
  5. 不要想着一口气吃成胖子。

小技巧

不过很多程序员阅读Go项目的代码里,总是从头看到尾,这种阅读方法的效率非常低,而且抓不住重点,可能被各种代码嵌套给弄晕了。

在这里提供一个小技巧,让我们可以快速地熟悉一个库:

对一个Go语言库(标准库或第三方)阅读正常源码的正常顺序是:

库函数 > 结构定义 > 结构函数

理清库函数

所谓的库函数,在Go语言的库中,就是这个库对外的提供功能的函数,也就是首字母大写的函数。

我们使用go doc命令,再配置linux的grep命令,就可以筛选出一个库的库函数了,以context包为例:

go doc context | grep "^func"

执行结果:

func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)

对于第三方,我们把源码下载到本地后,通过cd命令,进入到源码目录,再执行上述命令,也一样可以获得库函数列表,如:

go doc | grep "^func"

梳理结构的定义

一个优秀库一般都会定义许多struct进行功能封装,所以明白一个库中的struct的定义,对我们理解库的逻辑与功能至关重要。

我们同样使用go doc来筛选struct,以time包为例:

go doc time | grep "^type"|grep struct

执行结果:

type Location struct{ ... }
type ParseError struct{ ... }
type Ticker struct{ ... }
type Time struct{ ... }
type Timer struct{ ... }

探究结构方法

在第二步中,我们梳理了一个Go的结构定义,也就是梳理一个库有多少个struct,而这些struct会有对应的方法(method),用于实现功能,通过理解struct的方法,我们就可以明白这个struct在这个库到底是用来做什么的。

对于struct方法,也可以先看那些以大写字母开头的方法,因此这些是这个struct提供对外的功能。

小结

理清库函数,可以让我们明白一个库的对外功能,梳理结构定义,可以让我们明白一个库如何组织代码去提供功能,最后探究结构方法,可以明白具体的实现逻辑;只要我们遵循这样的方法去阅读Go库的源码,相信一定会事半功倍的!