我是平也,这有一个专注Gopher技术与成长的开源项目「go home」

导读

学习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
  • 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使用。

.
├── 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类型文件。

bufio

主要用于文本的读取写入,对io.Reader和io.Writer进行了实现和封装,提供了比较便利的方法操作文件。

builtin

定义了常用了内置类型、函数和接口,比如make、new、len、error等。

bytes

定义了用来操作字节的函数。

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

压缩、解压工具,支持bzip2、flate、gzip、lzw、zlib等格式。

container

提供了双向链表(list)、堆(heap)、环形联表(ring)的数据结构的操作。

context

通常在goroutine切换执行时,需要知道相关状态信息才能执行,而这些信息就被封装在context中,它的使用在Go语言中十分广泛。

crypto

封装了很多加解密算法,比如rsa、sha1、aes、md5等函数。

database

提供了各种数据库的通用API,比如SQLite、MySQL、Postgres。

debug

支持Go程序调试。

encoding

封装了各类编码的实现,比如base64、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

封装了crc32、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

封装了utf8、utf16的编解码方法。

unsafe

用于一些不安全的操作场景,比如正常情况下,指向不同类型数据的指针是无法互相转换的,但是就可以用unsafe的Pointer方法来实现,所以应该要谨慎使用。


感谢大家的观看,如果觉得文章对你有所帮助,欢迎关注公众号「平也」,聚焦Go语言与技术原理。

Golang源码分析之目录详解的更多相关文章

  1. 【集合框架】JDK1.8源码分析之ArrayList详解(一)

    [集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...

  2. nginx源码分析线程池详解

    nginx源码分析线程池详解 一.前言     nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...

  3. vuex 源码分析(六) 辅助函数 详解

    对于state.getter.mutation.action来说,如果每次使用的时候都用this.$store.state.this.$store.getter等引用,会比较麻烦,代码也重复和冗余,我 ...

  4. vuex 源码分析(五) action 详解

    action类似于mutation,不同的是Action提交的是mutation,而不是直接变更状态,而且action里可以包含任意异步操作,每个mutation的参数1是一个对象,可以包含如下六个属 ...

  5. Tomcat源码分析 | 一文详解生命周期机制Lifecycle

    目录 什么是Lifecycle? Lifecycle方法 LifecycleBase 增加.删除和获取监听器 init() start() stop() destroy() 模板方法 总结 前言 To ...

  6. Java 容器源码分析之集合类详解

    集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └W ...

  7. Cloudera Impala源码分析: SimpleScheduler调度策略详解包括作用、接口及实现等

    问题导读:1.Scheduler任务中Distributed Plan.Scan Range是什么?2.Scheduler基本接口有哪些?3.QuerySchedule这个类如何理解?4.Simple ...

  8. 我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了

    一个十足的技术迷,2013年毕业,做过ERP.游戏.计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书<深入解析Java编译器:源码剖析与实例详解> ...

  9. MySQL源码分析以及目录结构 2

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

随机推荐

  1. iOS开发如何面对疫情过后的面试高峰期 !

    2020年本应该是一个 "爱你.爱你"的年份!却因为 黑天鹅 给我们带来非常大的影响! 一.2020年iOS招聘数据分析 这里是 2020年3月份BOSS直聘 北京iOS招聘前几页 ...

  2. CSS实现垂直居中布局

    垂直居中 每日更新前端基础,如果觉得不错,点个star吧

  3. Postman从入门到入门

    1.Postman简介 Postman是一个接口测试工具,在做接口测试的时候, Postman相当于一个客户端,可以发送请求到服务器端.Postman分为Chrome插件版本(不再更新维护)和Nati ...

  4. 【HDU5934】Bomb——有向图强连通分量+重建图

    题目大意 二维平面上有 n 个爆炸桶,i−thi-thi−th爆炸桶位置为 (xi,yi)(x_i, y_i)(xi​,yi​) 爆炸范围为 rir_iri​ ,且需要 cic_ici​ 的价格引爆, ...

  5. linggle使用技巧

    Linggle 搜索引擎是一个可用于英语写作的语法.句子工具,可帮助学习者分析更准确的英文写作建议,能够根据词性来推测短句和句子,可精准的分享出完整英文句子如何撰写. Linggle 是台湾学术团队研 ...

  6. apache 自带的ab.exe 测试网站的并发量(网站压力测试)

    AB(ApacheBench) 是 Apache 自带的超文本传输协议 (HTTP) 性能测试工具. 其设计意图是描绘当前所安装的 Apache 的执行性能, 主要是显示 Apache 每秒可以处理多 ...

  7. (线段树 -星星等级)Stars POJ - 2352

    题意: 给出n个星星的坐标 x,y ,当存在其他星星的坐标x1,y1满足x>=x1&&y>=y1时 这个星星的等级就加1. 注意: 题中给的数据是有规律的 ,y是逐渐增加的 ...

  8. nim博弈 LightOJ - 1253

    主要是写一下nim博弈的理解,这个题有点奇怪,不知道为什么判断奇偶性,如果有大佬知道还请讲解一下. //nim博弈 //a[0]~a[i] 异或结果为k 若k=0 则为平衡态 否则为非平衡态 //平衡 ...

  9. (note)从小白到产品经理之路

    学习了云课堂的产品课程,整理出部分笔记,以作备用参考,方便实际运用过程中查看巩固. 1.产品工具:Axure.mindmanager.viso.办公软件wps 2.产品人需要具备的品格 富有同理心,习 ...

  10. sql select sql查询

    select 一.课上练习代码 1 查询所有学生信息 select * from tb_student; select * from tb_teacher; 2 查询所有课程名称及学分(投影和别名) ...