6. 开篇 - 标准库源码分析《 刻意学习 Golang 》
golang 基础的语法特性基本已经学完了,这几天我一直在思考下一步的学习方向跟计划。有很多方向可以选择比如:可以学习 web 编程、网络编程,往应用方向学习等待。可是我思前想后还是觉得应用固然很重要,但是扎实的基础对于一个学习者来说更为重要!
最后确定了:分析标准库的源码。go 一共有 150+ 的包,这是一场长期攻坚战。
概述
为什么选择分析源码包?
- 标准库是 go 的核心。
- 标准库的使用是必修课,既然要学为何不直接知其所以然。
- 站在巨人的肩膀上,「学得多看得远」。
我认为通过标准库源码的分析可以收获:
- 标准库的使用。
- 标准库的底层实现。
- 学习大神的编码哲学。
- 极大的提高编码能力和水平。
- 英文水平「源码注释都是英文的」。
- 代码分析能力。
能看懂内核里面的代码就是最大的幸福,更不用说修改里面的代码了。
到现在发现 golang 真的很简洁。他的关键字很少,只有 25 个,如下:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
如何分析
整体将按照如下思路进行
- 整理出所有的包以及每个包大概的用途
- 以围绕
fmt包展开。 - 首先展开
fmt。 包的依赖,然后对依赖进行逐一分析「类似于执行 fmt 包的加载过程一样」。
如何对包进行分析?
- 翻译注释
- 解读源码分析逻辑
- 思考与练习包的使用
- 如果可以自己尝试实现包
- 总结
所有 Package 的集合
下面先大概列出所有的包以及它们的作用「有一些包的介绍来自《 Go 入门教程 》」
archive/tar和/zip-compress:压缩(解压缩)文件功能。fmt-io-bufio-path/filepath-flag:fmt: 提供了格式化输入输出功能。io: 提供了基本输入输出功能,大多数是围绕系统功能的封装。bufio: 缓冲输入输出功能的封装。path/filepath: 用来操作在当前系统中的目标文件名路径。flag: 对命令行参数的操作。
strings-strconv-unicode-regexp-bytes:strings: 提供对字符串的操作。strconv: 提供将字符串转换为基础类型的功能。unicode: 为 unicode 型的字符串提供特殊的功能。regexp: 正则表达式功能。bytes: 提供对字符型分片的操作。index/suffixarray: 子字符串快速查询。
math-math/cmath-math/big-math/rand-sort:math: 基本的数学函数。math/cmath: 对复数的操作。math/rand: 伪随机数生成。sort: 为数组排序和自定义集合。math/big: 大数的实现和计算。
container-/list-ring-heap: 实现对集合的操作。list: 双链表。ring: 环形链表。
builtin: 描述了允许 godoc 提供语言标识符的文档。compress/bzip2/flate/gzip/lzwzlibcompress/bzip2:实现了 bzip2 的解压缩。flate:实现了 DEFLATE 的数据压缩格式,如 RFC 1951 中所述。gzip:实现了 gzip 格式压缩文件的读写。lzw:实现了Lempel-Ziv-Welch压缩数据格式。zlib:实现了 zlib 数据压缩格式的读写。
context:定义了 Context 类型,它跨 API 边界和进程之间携带截止日期,取消信号和其他请求范围的值。cryptocrypto/md5crypto: 常见的加密常量的集合crypto/md5: md5 加密crypto/sha1: sha1 加密
errors: 实现了操作错误的方法expvar: 为通用变量提供标准化接口。hash: 所有散列函数实现的通用接口。html: HTML 文本进行转码和转义的功能.image、/color、/draw、/gif/jpegpngimage: 实现基本的二维图形库.image/color: 颜色基本库image/draw:提供图像合成功能image/gif:gif 图像解码器和编码器image/jpeg:image/png:
sort: 提供了用于排序切片和用户定义集合的原函数.unsafe: 包含了一些打破 Go 语言“类型安全”的命令,一般的程序中不会被使用,可用在 C/C++ 程序的调用中。syscall-os-os/exec:os: 提供给我们一个平台无关性的操作系统功能接口,采用类Unix设计,隐藏了不同操作系统间差异,让不同的文件系统和操作系统对象表现一致。os/exec: 提供我们运行外部操作系统命令和程序的方式。syscall: 底层的外部包,提供了操作系统底层调用的基本接口。
time-log:time: 日期和时间的基本操作。log: 记录程序运行时产生的日志,我们将在后面的章节使用它。
encoding/json-encoding/xml-text/template:encoding/json: 读取并解码和写入并编码 JSON 数据。encoding/xml:简单的 XML1.0 解析器。text/template:生成像 HTML 一样的数据与文本混合的数据驱动。
net-net/http:net: 网络数据的基本操作。http: 提供了一个可扩展的 HTTP 服务器和基础客户端,解析 HTTP 请求和回复。
runtime: Go 程序运行时的交互操作,例如垃圾回收和协程创建。reflect: 实现通过程序运行时反射,让程序操作任意类型的变量。sql: 为数据库提供围绕 SQL (或类 SQL) 的通用接口。
整列表可以在 Go Walker 查看。
总结
Go 的包还是挺多的,其实分析源码本身就是一件不容易的事,这时第一步,接下来要坚持下来。以此来驱动我提高编码能力跟代码质量以及英语水平。
最后重要的事情:如有不对或者错误的地方欢迎大家指正,或者意见建议。『初出茅庐、欢迎指点』
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: