共计 2714 个字符,预计需要花费 7 分钟才能阅读完成。
原文链接: 开始读 Go 源码了
学完 Go 的基础知识曾经有一段时间了,那么接下来应该学什么呢?有几个方向能够思考,比如说 Web 开发,网络编程等。
在下一阶段的学习之前,写了一个开源我的项目|Go 开发的一款分布式惟一 ID 生成零碎,如果你对这个我的项目感兴趣的话,能够在 GitHub 上拿到源码。
在写我的项目的过程中,发现一个问题。实现性能是没问题的,但不晓得本人写的代码是不是合乎 Go 的格调,是不是够优雅。所以我感觉相比于持续学习利用开发,不如向底层后退,打好根底,打好写 Go 代码的根底。
所以,我决定开始读 Go 规范库源码,Go 一共有 150+ 规范库,想要全副读完的话不是不可能,但相对是一项大工程,心愿本人能坚持下去。
为什么从 Go 规范库的源码开始读呢?因为最近也看了一些 Go 底层原理的书,说实话,像 goroutine 调度,gc 垃圾回收这些内容,基本就看不懂。这要是一上来就读这部分代码,恐怕间接就放弃 Go 语言学习了。
而规范库就不一样了,有一部分代码基本不波及底层原理,实现也绝对简略,同时又能对 Go 的理念加深了解,作为入门再好不过了。而后再由简入深,循序渐进,就像打怪降级一样,一步一步驯服 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
:环形链表。heap
:堆。
compress/bzip2
–/flate
–/gzip
–/lzw
–zlib
:compress/bzip2
:实现 bzip2 的解压。flate
:实现 deflate 的数据压缩格局,如 RFC 1951 所述。gzip
:实现 gzip 压缩文件的读写。lzw
:Lempel Ziv Welch 压缩数据格式实现。zlib
:实现 zlib 数据压缩格局的读写。
context
:用来简化对于解决单个申请的多个 goroutine 之间与申请域的数据、勾销信号、截止工夫等相干操作。crypto
–crypto/md5
–crypto/sha1
:crypto
:罕用明码常数的汇合。crypto/md5
:MD5 加密。crypto/sha1
:SHA1 加密。
errors
:实现操作出错的办法。expvar
:为公共变量提供标准化的接口。hash
:所有散列函数实现的通用接口。html
:HTML 文本转码本义性能。sort
:提供用于对切片和用户定义的汇合进行排序的原始函数。unsafe
:蕴含了一些突破 Go 语言「类型平安」的命令,个别程序不会应用,可用在 C/C++ 程序的调用中。syscall
–os
–os/exec
:syscall
:提供了操作系统底层调用的根本接口。os
:提供给咱们一个平台无关性的操作系统性能接口,采纳类 Unix 设计,暗藏了不同操作系统间差别,让不同的文件系统和操作系统对象体现统一。os/exec
:提供了运行内部操作系统命令和程序的形式。
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
:实现通过程序运行时反射,让程序操作任意类型的变量。
这里仅仅列举了一部分规范库,更全面的规范库列表大家能够间接看官网。
那么问题来了,这么多库从何下手呢?
我这里做一个简略的分类,因为程度无限,只能做一些简略的梳理,而后大家能够联合本人的理论状况来做抉择。
有些库波及到十分业余的常识,投入产出比可能会比拟低。比方 archive
、compress
以及 crypto
,波及到压缩算法以及加密算法的常识。
有些库属于工具类,比方 bufio
、bytes
、strings
、path
、strconv
等,这些库不波及畛域常识,浏览起来比拟容易。
有些库属于与操作系统打交道的,比方 os
,net
、sync
等,学习这些库须要对操作系统有明确的意识。
net
下的很多子包与网络协议相干,比方 net/http
,波及 http
报文的解析,须要对网络协议比拟理解。
如果想要深刻理解语言的底层原理,则须要浏览 runtime
库。
要想疾速入门,并且理解语言的设计理念,倡议浏览 io
以及 fmt
库,浏览后会对接口的设计了解更深。
我曾经看了一些源码,尽管过程苦楚,但的确十分有用。后期可能了解起来比拟艰难,用的工夫长一些,但造成固定套路之后,会越来越相熟,用的工夫也会更少,了解也会更粗浅。
后续我还会持续总结输入,请大家继续关注,让咱们学起来。
开源我的项目:
- https://github.com/yongxinz/id-maker
往期文章:
- 开源我的项目|Go 开发的一款分布式惟一 ID 生成零碎
- 测试小姐姐问我 gRPC 怎么用,我间接把这篇文章甩给了她
- gRPC,爆赞