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 的包还是挺多的,其实分析源码本身就是一件不容易的事,这时第一步,接下来要坚持下来。以此来驱动我提高编码能力跟代码质量以及英语水平。

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
高度自律,深度思考,以勤补拙
本帖由系统于 4年前 自动加精
讨论数量: 7

这个必须点赞了. 跟着大佬打好基础.共同努力加油.

5年前 评论

此教程必火,占个位

5年前 评论

持之以恒,大佬加油

4年前 评论

golang.google.cn/pkg/ 附上go标准库的文档 :blush:可惜是英文的,期待大神出个中文版的

3年前 评论

不太支持遍历一遍读标准库,首先这太多了,你读不完的。

然后编程这方面不太适合这种学习方法,问题驱动,有目的的去读才是最好的方式。

再标准库包括的知识太多了,os,net,regex,complier,data structure 等等,不光是语言的语法这么简单,每一个要展开的话,都是时间黑洞,除非你只是走马观花的看一边,根本不去了解原理,可是那样就没什么意义了,而且就不要谈自己实现一个库了。

所以我推荐找那么几个很常用的,比较典型的库来读即可,最好是用过这个库,对这个库基本的功能什么的有所了解,这时来读要好一些,当然最好的效果是想知道某个操作是怎么实现的,或者报了 error,想知道原理,这时来读效果也很高。

读源码也有很多技巧,比如利用好可视化工具,画函数调用图,写 test 等等,这个可以自己搜索一下。

当然读标准库真的能学到很多东西,比如最基本的标识符命名,注释写法,架构等,或者 go 本身的语言特性,如 interface,反射,断言等等,看多了很有帮助,但是正因为信息太多了,如果没有目的的去读的话,效果会比较差的。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!