为什么要看golang源码
如果是为了简简单单的使用golang, 也许我们不需要去看golang源码。但是, 如果真的想在这方便有更深入的了解, 还是有必要去研究部分源码, 去深入了解原理, 这样在以后的编码中能够做到更高效; 另外,品读研习源码也能够很好的熟悉golang语法, 学习优质的代码编写。
注释项目地址
注释源码见: cache2go-annotated
环境
- 系统: Linux amd64
- Go: 1.12.9
代码统计
通过工具统计代码如下:
github.com/AlDanial/cloc v 1.74 T=26.59 s (272.7 files/s, 80119.3 lines/s)
-----------------------------------------------------------------------------------
Language files blank comment code
-----------------------------------------------------------------------------------
Go 6422 154211 230199 1538978
Assembly 538 11929 17475 100852
HTML 50 6499 331 46892
C 108 1216 1095 7910
Perl 15 355 369 2258
JSON 12 0 0 2061
Bourne Shell 13 155 645 1089
Markdown 13 271 0 825
Bourne Again Shell 26 192 307 802
XML 4 85 9 623
JavaScript 5 101 153 612
Python 1 130 101 358
C/C++ Header 20 76 193 275
DOS Batch 5 52 1 241
Protocol Buffers 1 1 0 196
CSS 3 51 9 176
Windows Resource File 4 22 0 134
RobotFramework 1 0 0 106
make 8 12 10 44
Fortran 90 2 1 3 8
C++ 1 3 5 7
awk 1 1 6 7
-----------------------------------------------------------------------------------
SUM: 7253 175363 250911 1704454
-----------------------------------------------------------------------------------
看起来代码有170w行,无从下手。但其没必要对每一个模块都去研习,也不需要逐行去研习。只需要去研习关键的模块,了解概念、结构、流程以及代码组织等等。 这样算下来, 其实代码量也不多。
源码目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
.
├── api # Go的api检查器 (go tool api)
├── doc # GoHTML格式的官方文档和说明
├── lib #
├── misc #
├── src # 源码
│ ├── archive # 归档, 实现了tar/zip
│ ├── bufio # 缓存IO
│ ├── builtin # go内置预定义
│ ├── bytes # 实现了用于操作 []byte 的函数
│ ├── cmd # go 各种工具
│ ├── compress # 压缩/解压,实现了:bzip2、flate、gzip、lzw、zlib
│ ├── container # 容器数据结构,实现了: heap、list、ring
│ ├── context # Goroutine上下文
│ ├── crypto # 加密解密算法,实现了:aes、des、hmac、md5、rand、rsa、sha1、sha256、sha512等
│ ├── database # 提供了各种SQL或类SQL数据库的通用API
│ ├── debug # Go程序调试
│ ├── encoding # 编码,实现了:ascii85、asn1、base32、base64、binary、csv、gob、hex、json、pem、xml
│ ├── errors # 生成错误的函数, errors.New(text string)
│ ├── expvar # 公共变量包(添加变量,可以监控),通过http在/debug/vars显示,包含命令行和内存信息
│ ├── flag # 处理命令参数
│ ├── fmt # 格式化
│ ├── go # go
│ ├── hash # hash算法,实现了adler32、crc32、crc64、fnv
│ ├── html # template 实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出
│ ├── image # 2D图形
│ ├── index # suffixarray 后缀数组:使用内存后缀数组实现子串搜索
│ ├── internal # 内部包
│ ├── io # I/O 原语提供基本接口
│ ├── log # 日志
│ ├── math # 基本的常量和数学函数
│ ├── mime # 实现了MIME规范的一部分
│ ├── net # 网络I/O,包括TCP/IP,UDP,域名解析和Unix域套接字, http, mail, rpc, smtp, url 等
│ ├── os # 提供平台无关的OS接口
│ ├── path # 实现了针对操作斜线分割路径的实用例程
│ ├── plugin # 实现 Go 插件的加载和符号解析
│ ├── reflect # 实现运行时反射
│ ├── regexp # 正则表达式
│ ├── runtime # 包含与 Go 的运行时系统交互的操作
│ ├── sort # 排序
│ ├── strconv # 对基本数据类型的字符串表示的转换
│ ├── strings # 实现简单的函数来操纵 UTF-8 编码的字符串
│ ├── sync # 提供基本的同步原语
│ ├── syscall # 系统调用
│ ├── testing # 测试
│ ├── text # 文本相关的接口
│ ├── time # 时间
│ ├── unicode # unicode实现
│ └── unsafe # 包含绕过Go程序类型安全的操作
└── test # Go语言自身代码的文件
这里的源码目录结构,会跟着理解的深入而逐步更新。
给自己打气