读源码可以深层理解Go的编写方式,理解作者们的思维方式;也有助于对Go语法用法深刻的理解,我们从这一篇说一下如何读源码,从哪些源码着手,从
简单到深入的方式学习源码;
学习源码也是一个修炼过程,来修补自己代码上不规范的方式和更优化的方式;
查看方式
- 直接下载源码
git clone https://github.com/golang/go.git
- 在goland或vscode中查看对应的源码,提供了代码导航、跳转到定义、查找引用等功能。
阅读方式
阅读路线:
标准库: 从阅读 Go 的标准库开始是一个不错的选择。标准库是学习 Go 的核心,包括诸如 fmt、net、http 等包。
Go Runtime: 学习 Go 的运行时系统是深入理解语言的重要一步。阅读 runtime 包和与调度器、垃圾回收器相关的代码。
Go Tools: 了解 Go 工具链是一个好主意,包括 go build、go test 等。这有助于理解代码是如何构建和测试的。
Go Compiler: 如果你对编译器和语言的底层工作原理感兴趣,可以阅读 Go 的编译器源码。
Go Web 框架: 如果你对 Web 开发感兴趣,可以阅读一些知名的 Go Web 框架的源码,比如 Gin、Echo、Beego。
Go 源码库: 最终,你可以尝试阅读更底层的 Go 源码,如 cmd 目录下的一些工具,以及 src 目录下的 runtime。
更好地阅读和理解Go的源码:
- 阅读测试代码: Go项目通常会伴随有大量的测试代码。测试代码对于理解一个函数或模块的使用方法和预期行为非常有帮助。
- 阅读示例代码: Go的文档中经常包含示例代码,这些示例代码可以帮助你理解如何正确使用某个包或函数。
- 了解Go的工具链: Go语言有一套强大的工具链,包括
go build
、go test
、go run
等。了解这些工具的使用可以帮助你理解Go项目的构建和测试流程。 - 阅读注释: Go语言的代码通常包含丰富的注释,特别是在核心库中。这些注释解释了代码的设计思想和某些实现细节。
- 深入阅读核心库: 如果你对Go语言的核心库实现感兴趣,可以深入阅读
src/runtime
和src/reflect
等目录下的源代码。
举例
-
Go 语言编译器的源代码在
src/cmd/compile
目录中,目录下的文件共同组成了 Go 语言的编译器,学过编译原理的人可能听说过编译器的前端和后端,编译器的前端一般承担着词法分析、语法分析、类型检查和中间代码生成几部分工作,而编译器后端主要负责目标代码的生成和优化,也就是将中间代码翻译成目标机器能够运行的二进制机器码。- Go源码针对代码都提供的有单元测试,有助于我们深入学习,如:
flag用于解析命令行选项,flag方法源码:- flag.go- flag_test.gosrc/flag/flag_test.gofunc TestEverything(t *testing.T) {...m := make(map[string]*Flag)desired := "0"visitor := func(f *Flag) {if len(f.Name) > 5 && f.Name[0:5] == "test_" {m[f.Name] = fok := falseswitch {case f.Value.String() == desired:ok = truecase f.Name == "test_bool" && f.Value.String() == boolString(desired):ok = truecase f.Name == "test_duration" && f.Value.String() == desired+"s":ok = truecase f.Name == "test_func" && f.Value.String() == "":ok = true}if !ok {t.Error("Visit: bad value", f.Value.String(), "for", f.Name)}}}...}
参考
- Go 语言设计与实现
- go by example 中文版