关于golang:开始读-Go-源码了

62次阅读

共计 2714 个字符,预计需要花费 7 分钟才能阅读完成。

原文链接: 开始读 Go 源码了

学完 Go 的基础知识曾经有一段时间了,那么接下来应该学什么呢?有几个方向能够思考,比如说 Web 开发,网络编程等。

在下一阶段的学习之前,写了一个开源我的项目|Go 开发的一款分布式惟一 ID 生成零碎,如果你对这个我的项目感兴趣的话,能够在 GitHub 上拿到源码。

在写我的项目的过程中,发现一个问题。实现性能是没问题的,但不晓得本人写的代码是不是合乎 Go 的格调,是不是够优雅。所以我感觉相比于持续学习利用开发,不如向底层后退,打好根底,打好写 Go 代码的根底。

所以,我决定开始读 Go 规范库源码,Go 一共有 150+ 规范库,想要全副读完的话不是不可能,但相对是一项大工程,心愿本人能坚持下去。

为什么从 Go 规范库的源码开始读呢?因为最近也看了一些 Go 底层原理的书,说实话,像 goroutine 调度,gc 垃圾回收这些内容,基本就看不懂。这要是一上来就读这部分代码,恐怕间接就放弃 Go 语言学习了。

而规范库就不一样了,有一部分代码基本不波及底层原理,实现也绝对简略,同时又能对 Go 的理念加深了解,作为入门再好不过了。而后再由简入深,循序渐进,就像打怪降级一样,一步一步驯服 Go。

说了这么多,那到底应该怎么读呢?我想到了一些办法:

  • 看官网规范库文档。
  • 看网上其他人的技术文章。
  • 写一些例子来练习如何应用。
  • 如果能够的话,本人实现规范库的性能。
  • 将本人的浏览心得总结输入。

能够通过下面的一种或几种办法相结合,而后再一直浏览一直总结,最终找到一个齐全适宜本人的办法。

上面是我总结的一些规范库及性能介绍:

  • archive/tar/zip-compress:压缩(解压缩)文件性能。
  • fmtiobufiopath/filepathflag

    • fmt:提供格式化输入输出性能。
    • io:提供根本输入输出性能,大多数是围绕零碎性能的封装。
    • bufio:缓冲输入输出性能的封装。
    • path/filepath:用来操作在以后零碎中的指标文件名门路。
    • flag:提供对命令行参数的操作。
  • stringsstrconvunicoderegexpbytes

    • strings:提供对字符串的操作。
    • strconv:提供将字符串转换为根底类型的性能。
    • unicode:为 unicode 型的字符串提供非凡的性能。
    • regexp:正则表达式性能。
    • bytes:提供对字符型分片的操作。
    • index/suffixarray:子字符串疾速查问。
  • mathmath/cmathmath/bigmath/rand-sort

    • math:根本的数学函数。
    • math/cmath:对复数的操作。
    • math/rand:伪随机数生成。
    • sort:为数组排序和自定义汇合。
    • math/big:大数的实现和计算。
  • container/list/ring/heap

    • list:双链表。
    • ring:环形链表。
    • heap:堆。
  • compress/bzip2/flate/gzip/lzwzlib

    • compress/bzip2:实现 bzip2 的解压。
    • flate:实现 deflate 的数据压缩格局,如 RFC 1951 所述。
    • gzip:实现 gzip 压缩文件的读写。
    • lzw:Lempel Ziv Welch 压缩数据格式实现。
    • zlib:实现 zlib 数据压缩格局的读写。
  • context:用来简化对于解决单个申请的多个 goroutine 之间与申请域的数据、勾销信号、截止工夫等相干操作。
  • cryptocrypto/md5crypto/sha1

    • crypto:罕用明码常数的汇合。
    • crypto/md5:MD5 加密。
    • crypto/sha1:SHA1 加密。
  • errors:实现操作出错的办法。
  • expvar:为公共变量提供标准化的接口。
  • hash:所有散列函数实现的通用接口。
  • html:HTML 文本转码本义性能。
  • sort:提供用于对切片和用户定义的汇合进行排序的原始函数。
  • unsafe:蕴含了一些突破 Go 语言「类型平安」的命令,个别程序不会应用,可用在 C/C++ 程序的调用中。
  • syscallosos/exec

    • syscall:提供了操作系统底层调用的根本接口。
    • os:提供给咱们一个平台无关性的操作系统性能接口,采纳类 Unix 设计,暗藏了不同操作系统间差别,让不同的文件系统和操作系统对象体现统一。
    • os/exec:提供了运行内部操作系统命令和程序的形式。
  • timelog

    • time:日期和工夫的基本操作。
    • log:记录程序运行时产生的日志。
  • encoding/jsonencoding/xmltext/template

    • encoding/json:读取并解码和写入并编码 JSON 数据。
    • encoding/xml:简略的 XML1.0 解析器。
    • text/template:生成像 HTML 一样的数据与文本混合的数据驱动模板。
  • netnet/http

    • net:网络数据的基本操作。
    • http:提供了一个可扩大的 HTTP 服务器和根底客户端,解析 HTTP 申请和回复。
  • runtime:Go 程序运行时的交互操作,例如垃圾回收和协程创立。
  • reflect:实现通过程序运行时反射,让程序操作任意类型的变量。

这里仅仅列举了一部分规范库,更全面的规范库列表大家能够间接看官网。

那么问题来了,这么多库从何下手呢?

我这里做一个简略的分类,因为程度无限,只能做一些简略的梳理,而后大家能够联合本人的理论状况来做抉择。

有些库波及到十分业余的常识,投入产出比可能会比拟低。比方 archivecompress 以及 crypto,波及到压缩算法以及加密算法的常识。

有些库属于工具类,比方 bufiobytesstringspathstrconv 等,这些库不波及畛域常识,浏览起来比拟容易。

有些库属于与操作系统打交道的,比方 osnetsync 等,学习这些库须要对操作系统有明确的意识。

net 下的很多子包与网络协议相干,比方 net/http,波及 http 报文的解析,须要对网络协议比拟理解。

如果想要深刻理解语言的底层原理,则须要浏览 runtime 库。

要想疾速入门,并且理解语言的设计理念,倡议浏览 io 以及 fmt 库,浏览后会对接口的设计了解更深。

我曾经看了一些源码,尽管过程苦楚,但的确十分有用。后期可能了解起来比拟艰难,用的工夫长一些,但造成固定套路之后,会越来越相熟,用的工夫也会更少,了解也会更粗浅。

后续我还会持续总结输入,请大家继续关注,让咱们学起来。


开源我的项目:

  • https://github.com/yongxinz/id-maker

往期文章:

  • 开源我的项目|Go 开发的一款分布式惟一 ID 生成零碎
  • 测试小姐姐问我 gRPC 怎么用,我间接把这篇文章甩给了她
  • gRPC,爆赞
正文完
 0