0%

【golang源码分析】之源码结构

为什么要看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语言自身代码的文件

  这里的源码目录结构,会跟着理解的深入而逐步更新。

给自己打气

  

-------------本文结束感谢您的阅读-------------