我是平也,这有一个专注gopher技术与成长的开源项目
学习go语言源码的第一步就是了解先了解它的目录结构,你对它的源码目录了解多少呢?
. ├── authors ├── contributing.md ├── contributors ├── license ├── patents ├── readme.boringcrypto.md ├── readme.md ├── security.md ├── api ├── doc ├── favicon.ico ├── lib ├── misc ├── robots.txt ├── src └── test 6 directories, 10 files
该目录中的每个文件都是go语言api列表,每行一个,方便ide使用。
. ├── readme ├── except.txt ├── go1.1.txt ├── go1.10.txt ├── go1.11.txt ├── go1.12.txt ├── go1.13.txt ├── go1.14.txt ├── go1.2.txt ├── go1.3.txt ├── go1.4.txt ├── go1.5.txt ├── go1.6.txt ├── go1.7.txt ├── go1.8.txt ├── go1.9.txt ├── go1.txt └── next.txt 0 directories, 18 files
归档文件处理库,可以用来处理tar与zip类型文件。
主要用于文本的读取写入,对io.reader和io.writer进行了实现和封装,提供了比较便利的方法操作文件。
定义了常用了内置类型、函数和接口,比如make、new、len、error等。
定义了用来操作字节的函数。
提供了go语言的基本工具,比如我们常用的代码格式化工具gofmt、静态检查工具vet等。
. ├── readme.vendor ├── addr2line ├── api ├── asm ├── buildid ├── cgo ├── compile ├── cover ├── dist ├── doc ├── fix ├── go ├── go.mod ├── go.sum ├── gofmt ├── internal ├── link ├── nm ├── objdump ├── pack ├── pprof ├── test2json ├── trace ├── vendor └── vet 22 directories, 3 files
下面列举出几个比较常用的工具:
压缩、解压工具,支持bzip2、flate、gzip、lzw、zlib等格式。
提供了双向链表(list)、堆(heap)、环形联表(ring)的数据结构的操作。
通常在goroutine切换执行时,需要知道相关状态信息才能执行,而这些信息就被封装在context中,它的使用在go语言中十分广泛。
封装了很多加解密算法,比如rsa、sha1、aes、md5等函数。
提供了各种数据库的通用api,比如sqlite、mysql、postgres。
支持go程序调试。
封装了各类编码的实现,比如base64、json、xml、hex等。
. ├── ascii85 ├── asn1 ├── base32 ├── base64 ├── binary ├── csv ├── encoding.go ├── gob ├── hex ├── json ├── pem └── xml 11 directories, 1 file
是我们经常使用的错误函数,也可以自定义。
提供了一系列标准接口,可以通过http的方式将服务器的变量以json格式打印出来。
解析处理命令行参数的工具。
封装了各种格式化输出方法。
封装了crc32、crc64在内的哈希函数。
html模板引擎,可以将代码与html混合在一起,它会负责解析转义,类似python的jinja、php的smarty等。
一般语言都会有的图像处理库。
用来实现字符串高速匹配查找。
internal专门用来控制包导入权限的,以internal命名的包只允许它父级和父级的子级目录导入。
. |-- checker | |-- internal | | |-- cpu | | | `-- cpu.go | | `-- ram | | `-- ram.go | `-- server.go |-- go.mod |-- go.sum `-- main.go
如上代码,checker/internal/cpu和checker/internal/ram只能被checker包及其子包中的代码导入,不能被main.go导入,否则会报错。
为文件i/o提供了一些基本的接口,bufio就对它进行了实现。
封装了日志记录方法,比如log.fatal、log.print等。
封装了基本的数学相关的函数。
封装了mime类型的解析,mime是媒体类型,比如文档、文件、字节流性质的格式。
封装了各种网络io的函数,比如tcp、udp、socket等。
封装了用来操作操作系统的命令,比如调用exec可以执行shell脚本等,当然它支持不同平台的操作。
实现了用于处理斜杠分隔符路径的函数。
go1.8版本以后提供的插件机制,可以动态地加载动态链接库文件.so,这样对外发布动态链接库就不需要把源码给到对方进行编译了。
封装反射读取方法,比如读取结构体的方法、属性等。
封装了正则表达式的实现。
包含了go运行时的操作,这块水很深,这里目前不再展开陈述。
封装了部分排序算法。
封装了基础类型与字符串互相转换的方法,比如int转string,反之亦然。
封装了字符串操作的相关方法。
封装了基本的同步机制,各种锁的实现。
封装了一系列系统调用的接口。
为go语言测试程序提供支持。
封装了文本处理相关的方法,比如文本扫描或文本标签过滤器等。
封装了时间处理相关的函数,比如获取当前时间,计算时间差等。
封装了utf8、utf16的编解码方法。
用于一些不安全的操作场景,比如正常情况下,指向不同类型数据的指针是无法互相转换的,但是就可以用unsafe的pointer方法来实现,所以应该要谨慎使用。
感谢大家的观看,如果觉得文章对你有所帮助,欢迎关注公众号「平也」,聚焦go语言与技术原理。
如对本文有疑问, 点击进行留言回复!!
VSCode1.4 搭建Golang的开发调试环境(遇到很多问题)
网友评论