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 /lzw zlib
    • compress/bzip2:实现了 bzip2 的解压缩。
    • flate:实现了 DEFLATE 的数据压缩格式,如 RFC 1951 中所述。
    • gzip:实现了 gzip 格式压缩文件的读写。
    • lzw:实现了Lempel-Ziv-Welch压缩数据格式。
    • zlib:实现了 zlib 数据压缩格式的读写。
  • context:定义了 Context 类型,它跨 API 边界和进程之间携带截止日期,取消信号和其他请求范围的值。
  • crypto crypto/md5
    • crypto: 常见的加密常量的集合
    • crypto/md5: md5 加密
    • crypto/sha1: sha1 加密
  • errors: 实现了操作错误的方法
  • expvar: 为通用变量提供标准化接口。
  • hash: 所有散列函数实现的通用接口。
  • html: HTML 文本进行转码和转义的功能.
  • image/color/draw/gif /jpeg png
    • image: 实现基本的二维图形库.
    • 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 的包还是挺多的,其实分析源码本身就是一件不容易的事,这时第一步,接下来要坚持下来。以此来驱动我提高编码能力跟代码质量以及英语水平。

最后重要的事情:如有不对或者错误的地方欢迎大家指正,或者意见建议。『初出茅庐、欢迎指点』