系统入门深度学习,直击算法工程师
开端读 Go 源码了
为什么从 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://www.zxit666.com/2576/