开源项目「go home」聚焦Go语言技术栈与面试题,以协助Gopher登上更大的舞台,欢迎
go home
~php
导读
学习Go语言源码的第一步就是了解先了解它的目录结构,你对它的源码目录了解多少呢?今天我整理了一份超详细的Go语言源码目录说明,基于Go1.14版本整理,欢迎收藏~html
目录总览
. ├── 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
- AUTHORS:Golang官方做者清单
- CONTRIBUTING.md:加入贡献者队列的指导文件
- CONTRIBUTORS:第三方贡献者清单
- LICENSE:受权协议
- PATENTS:专利
- README.boringcrypto.md:由于Golang是Google发布的,这是针对Google内部研究分支的说明
- README.md:说明文件,你们都明白,每一个开源库都有
- SECURITY.md:安全政策
- api:Golang每一个版本的功能列表归档文件,下面有具体介绍
- doc:Golang文档说明,和官方文档相同,能够离线查看
- favicon.ico:浏览器页签左边的图标,通常放在网站根目录,就长这样
- lib:看起来像是库文档模板,里面列举了time包的说明
- misc:聚集了Go语言相关的IDE、插件、cgo测试程序、示例等乱七八糟的东西
- robots.txt:主要用来控制各大搜索引擎爬虫的爬取规则
- src:Golang核心实现都在这里,下面详细讲述
- test:Golang单元测试程序,经过查看测试程序能够学习到golang的用法和特性
目录延伸
api
该目录中的每一个文件都是Go语言API列表,每行一个,方便IDE使用。python
. ├── 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
- README:说明文件,里面有对该目录下文件做用的说明
- except.txt:列举了接下来可能会废弃的API,可是并不影响兼容问题
- go*.txt:囊括了每一个版本的API列表,文件内容只增不减,版本发布后就归档再也不改动
- next.txt:列举了将来的版本可能实现的新功能
src
archive
归档文件处理库,能够用来处理tar与zip类型文件。linux
bufio
主要用于文本的读取写入,对io.Reader和io.Writer进行了实现和封装,提供了比较便利的方法操做文件。git
builtin
定义了经常使用了内置类型、函数和接口,好比make、new、len、error等。github
bytes
定义了用来操做字节的函数。golang
cmd
提供了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
下面列举出几个比较经常使用的工具:正则表达式
- addr2line:由于linux上才支持这个命令,因此这里作了一个模拟器,用来支持pprof的
- objdump:跟addr2line做用同样,这是linux中该命令的模拟实现,用来支持pprof
- api:用于生成Go语言API列表,也就是上面提到的api目录下的go*.txt文件
- asm:汇编器,将源文件汇编为目标文件
- buildid:用来更新库或二进制文件中构建的标识
- cgo:支持建立调用C代码的包
- compile:编译工具
- go:咱们常常用的go命令,管理源代码工具
- godoc:用于提取并生成Go程序文档
- gofmt:代码格式化工具
- pack:备份压缩工具,是unix系统中ar工具的简单实现,它能够将多个文件打包为一个备存文件
- link:链接器
- vet:代码静态检查工具
- dist:是一个引导程序,负责构建Go语言的其余工具
- fix:用来找到使用旧API的程序,而后更新为新的API
- cover:用来分析单元测试覆盖率的工具
- inernal:一些内部通用实现,被其余包调用
- nm:列出了由目标文件,归档文件或可执行文件定义或使用的符号
- pprof:Go程序的性能分析工具
- vendor:Go语言包依赖工具
- test2json:将Go测试程序的输出转换为机器可读的JSON流
- trace:用来跟踪分析goroutines运行调度状态等功能的工具,比pprof更加细粒度
compress
压缩、解压工具,支持bzip二、flate、gzip、lzw、zlib等格式。算法
container
提供了双向链表(list)、堆(heap)、环形联表(ring)的数据结构的操做。
context
一般在goroutine切换执行时,须要知道相关状态信息才能执行,而这些信息就被封装在context中,它的使用在Go语言中十分普遍。
crypto
封装了不少加解密算法,好比rsa、sha一、aes、md5等函数。
database
提供了各类数据库的通用API,好比SQLite、MySQL、Postgres。
debug
支持Go程序调试。
encoding
封装了各种编码的实现,好比base6四、json、xml、hex等。
. ├── ascii85 ├── asn1 ├── base32 ├── base64 ├── binary ├── csv ├── encoding.go ├── gob ├── hex ├── json ├── pem └── xml 11 directories, 1 file
errors
是咱们常用的错误函数,也能够自定义。
expvar
提供了一系列标准接口,能够经过HTTP的方式将服务器的变量以JSON格式打印出来。
flag
解析处理命令行参数的工具。
fmt
封装了各类格式化输出方法。
go
hash
封装了crc3二、crc64在内的哈希函数。
html
HTML模板引擎,能够将代码与HTML混合在一块儿,它会负责解析转义,相似python的jinja、php的smarty等。
image
通常语言都会有的图像处理库。
index
用来实现字符串高速匹配查找。
internal
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导入,不然会报错。
io
为文件I/O提供了一些基本的接口,bufio就对它进行了实现。
log
封装了日志记录方法,好比log.Fatal、log.Print等。
math
封装了基本的数学相关的函数。
mime
封装了MIME类型的解析,MIME是媒体类型,好比文档、文件、字节流性质的格式。
net
封装了各类网络IO的函数,好比TCP、UDP、Socket等。
os
封装了用来操做操做系统的命令,好比调用exec能够执行shell脚本等,固然它支持不一样平台的操做。
path
实现了用于处理斜杠分隔符路径的函数。
plugin
Go1.8版本之后提供的插件机制,能够动态地加载动态连接库文件.so,这样对外发布动态连接库就不须要把源码给到对方进行编译了。
reflect
封装反射读取方法,好比读取结构体的方法、属性等。
regexp
封装了正则表达式的实现。
runtime
包含了Go运行时的操做,这块水很深,这里目前再也不展开陈述。
sort
封装了部分排序算法。
strconv
封装了基础类型与字符串互相转换的方法,好比int转string,反之亦然。
strings
封装了字符串操做的相关方法。
sync
封装了基本的同步机制,各类锁的实现。
syscall
封装了一系列系统调用的接口。
testing
为Go语言测试程序提供支持。
text
封装了文本处理相关的方法,好比文本扫描或文本标签过滤器等。
time
封装了时间处理相关的函数,好比获取当前时间,计算时间差等。
unicode
封装了utf八、utf16的编解码方法。
unsafe
用于一些不安全的操做场景,好比正常状况下,指向不一样类型数据的指针是没法互相转换的,可是就能够用unsafe的Pointer方法来实现,因此应该要谨慎使用。
感谢你们的观看,若是以为文章对你有所帮助,欢迎关注公众号「平也」,聚焦Go语言与技术原理。