01.Golang 源码目录结构

Golang 源码目录结构

目录总览

bash 复制代码
├── README.md #说明文件
├── SECURITY.md #安全政策
├── api #Golang每个版本的功能列表归档文件
├── doc #Golang文档说明,和官方文档相同,可以离线查看
├── lib #像是库文档模板,里面列举了time包的说明
├── misc #其他的一些工具,相当于大杂烩,大部分是各种编辑器的Go语言支持,还有cgo的例子等
├── src #Golang核心实现:基本工具(编译器等)、标准库
└── test #包含很多测试程序(并非_test.go方式的单元测试,而是包含main包的测试),包括一些fixbug测试,通过查看测试程序可以学习到golang的用法和特性

api

该目录中的每个文件都是 Go 语言 API 列表,每行一个,方便 IDE 使用。

python 复制代码
├── except.txt
├── go1.1.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.10.txt
├── go1.11.txt
├── go1.12.txt
├── go1.13.txt
├── go1.14.txt
├── go1.15.txt
├── go1.16.txt
├── go1.17.txt
├── go1.18.txt
├── go1.19.txt
├── go1.20.txt
├── go1.21.txt
├── go1.22.txt
├── go1.23.txt
├── go1.txt
├── next
└── README
  • README:说明文件,里面有对该目录下文件作用的说明
  • except.txt:列举了接下来可能会废弃的 API,但是并不影响兼容问题
  • go*.txt:囊括了每个版本的 API 列表,文件内容只增不减,版本发布后就归档不再改动
  • next:目录只包含要修改的文件,该目录中的每个文件都包含可以添加的特性列表到Go的下一个版本

src

中文版核心库代码解释

bash 复制代码
├── archive #压缩 (解压缩) 文件功能。
├── bufio #主要用于文本的读取写入,对io.Reader和io.Writer进行了实现和封装,提供了比较便利的方法操作文件。
├── builtin #定义了常用了内置类型、函数和接口,比如make、new、len、error等。
├── bytes #定义了用来操作字节的函数。
├── cmd #提供了Go语言的基本工具,比如我们常用的代码格式化工具gofmt、静态检查工具vet等。
├── compress #压缩、解压工具,支持bzip2、flate、gzip、lzw、zlib等格式。
├── constraints #约束定义了一组与类型参数一起使用的有用约束。
├── container  #提供了双向链表(list)、堆(heap)、环形联表(ring)的数据结构的操作。
├── context #通常在goroutine切换执行时,需要知道相关状态信息才能执行,而这些信息就被封装在context中,它的使用在Go语言中十分广泛。
├── crypto #封装了很多加解密算法,比如rsa、sha1、aes、md5等函数。
├── database #提供了各种数据库的通用API,比如SQLite、MySQL、Postgres。
├── debug #支持Go程序调试。
├── embed  #包嵌入提供了对正在运行的 Go 程序中嵌入的文件的访问。
├── encoding #封装了各类编码的实现,比如base64、json、xml、hex等。
├── errors #是我们经常使用的错误函数,也可以自定义。
├── expvar #提供了一系列标准接口,可以通过HTTP的方式将服务器的变量以JSON格式打印出来。
├── flag #解析处理命令行参数的工具。
├── fmt #封装了各种格式化输出方法。
├── go
├── hash #封装了crc32、crc64在内的哈希函数。
├── html #HTML模板引擎,可以将代码与HTML混合在一起,它会负责解析转义,类似python的jinja、php的smarty等。
├── image #一般语言都会有的图像处理库。
├── index #用来实现字符串高速匹配查找。
├── internal #internal专门用来控制包导入权限的,以internal命名的包只允许它父级和父级的子级目录导入。
├── io #为文件I/O提供了一些基本的接口,bufio就对它进行了实现。
├── log #封装了日志记录方法,比如log.Fatal、log.Print等。
├── math #封装了基本的数学相关的函数。
├── math/big: 大数的实现和计算。   
├── mime #封装了MIME类型的解析,MIME是媒体类型,比如文档、文件、字节流性质的格式。
├── net #封装了各种网络IO的函数,比如TCP、UDP、Socket等。
├── os #提供给我们一个平台无关性的操作系统功能接口,采用类 Unix 设计,隐藏了不同操作系统间差异,让不同的文件系统和操作系统对象表现一致。
├── 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方法来实现,所以应该要谨慎使用。
└── vendor

cmd

perl 复制代码
├── addr2line #因为linux上才支持这个命令,所以这里做了一个模拟器,用来支持pprof的
├── api #用于生成Go语言API列表
├── asm #汇编器,将源文件汇编为目标文件
├── buildid #用来更新库或二进制文件中构建的标识
├── cgo #支持创建调用C代码的包
├── compile #编译工具
├── cover #用来分析单元测试覆盖率的工具
├── dist #是一个引导程序,负责构建Go语言的其他工具
├── doc #用于提取并生成Go程序文档
├── fix #用来找到使用旧API的程序,然后更新为新的API
├── go #我们经常用的go命令,管理源代码工具
├── gofmt #代码格式化工具
├── internal #一些内部通用实现,被其他包调用
├── link #连接器
├── nm #列出了由目标文件,归档文件或可执行文件定义或使用的符号
├── objdump #跟addr2line作用一样,这是linux中该命令的模拟实现,用来支持pprof
├── pack #备份压缩工具,是unix系统中ar工具的简单实现,它可以将多个文件打包为一个备存文件
├── pprof #Go程序的性能分析工具
├── README.vendor
├── test2json #将Go测试程序的输出转换为机器可读的JSON流
├── trace #用来跟踪分析goroutines运行调度状态等功能的工具,比pprof更加细粒度
├── vendor #Go语言包依赖工具
├── go.mod
├── go.sum
└── vet #代码静态检查工具

runtime

bash 复制代码
|── alg.c     Type结构体中的alg,类型操作。
|── append_test.go
|── arch_386.h
|── arch_amd64.h
|── arch_arm.h
|── asm_386.s     
|── asm_amd64.s
|── asm_arm.s
|── atomic_386.c
|── atomic_amd64.c
|── atomic_arm.c
|── callback_windows_386.c
|── callback_windows_amd64.c
|── cgo
|   ├── asm_386.s
|   ├── asm_amd64.s
|   ├── asm_arm.s
|   ├── callbacks.c
|   ├── cgo.go
|   ├── cgo_arm.c
|   ├── freebsd.c
|   ├── gcc_386.S
|   ├── gcc_amd64.S
|   ├── gcc_arm.S
|   ├── gcc_darwin_386.c
|   ├── gcc_darwin_amd64.c
|   ├── gcc_freebsd_386.c
|   ├── gcc_freebsd_amd64.c
|   ├── gcc_freebsd_arm.c
|   ├── gcc_linux_386.c
|   ├── gcc_linux_amd64.c
|   ├── gcc_linux_arm.c
|   ├── gcc_netbsd_386.c
|   ├── gcc_netbsd_amd64.c
|   ├── gcc_netbsd_arm.c
|   ├── gcc_openbsd_386.c
|   ├── gcc_openbsd_amd64.c
|   ├── gcc_setenv.c
|   ├── gcc_util.c
|   ├── gcc_windows_386.c
|   ├── gcc_windows_amd64.c
|   ├── iscgo.c
|   ├── libcgo.h
|   ├── netbsd.c
|   ├── openbsd.c
|   └── setenv.c
|── cgocall.c
|── cgocall.h
|── chan.c     通道的实现
|── compiler.go
|── complex.c
|── cpuprof.c     pprof相关
|── debug
|   ├── debug.c
|   ├── garbage.go
|   ├── garbage_test.go
|   ├── stack.go
|   └── stack_test.go
|── debug.go
|── defs1_linux.go
|── defs2_linux.go
|── defs_arm_linux.go
|── defs_darwin.go
|── defs_darwin_386.h
|── defs_darwin_amd64.h
|── defs_freebsd.go
|── defs_freebsd_386.h
|── defs_freebsd_amd64.h
|── defs_freebsd_arm.h
|── defs_linux.go
|── defs_linux_386.h
|── defs_linux_amd64.h
|── defs_linux_arm.h
|── defs_netbsd.go
|── defs_netbsd_386.go
|── defs_netbsd_386.h
|── defs_netbsd_amd64.go
|── defs_netbsd_amd64.h
|── defs_netbsd_arm.go
|── defs_netbsd_arm.h
|── defs_openbsd.go
|── defs_openbsd_386.h
|── defs_openbsd_amd64.h
|── defs_plan9_386.h
|── defs_plan9_amd64.h
|── defs_windows.go
|── defs_windows_386.h
|── defs_windows_amd64.h
|── env_plan9.c
|── env_posix.c
|── error.go
|── extern.go
|── float.c
|── gc_test.go
|── hashmap.c     map容器的底层实现
|── hashmap.h
|── hashmap_fast.c
|── iface.c     interface的底层实现
|── lfstack.c     垃圾回收中用到了这个文件,lock free stack的缩写。垃圾回收中,利用来实现PtrBuffer的并发安全性
|── lock_futex.c
|── lock_sema.c
|── malloc.goc     malloc相关的封装,提供了runtime.mallocgc
|── malloc.h
|── malloc1.go
|── mallocrand.go
|── mallocrep.go
|── mallocrep1.go
|── mcache.c    内存管理实现相关,MCache层次的数据结构和操作
|── mcentral.c     内存管理实现相关,MCentral层次的数据结构和操作
|── mem.go     内存信息统计
|── mem_darwin.c
|── mem_freebsd.c
|── mem_linux.c     内存分配相关,依赖于系统部分的分配函数。最下层接口,这里提供SysAlloc分配大块内存,提供runtime内存池使用
|── mem_netbsd.c
|── mem_openbsd.c
|── mem_plan9.c
|── mem_windows.c
|── memclr_arm.s
|── memmove_386.s
|── memmove_amd64.s
|── memmove_arm.s
|── memmove_linux_amd64_test.go
|── mfinal.c
|── mfinal_test.go
|── mfixalloc.c
|── mgc0.c     垃圾回收最核心的部分都是在这一个文件里实现的
|── mgc0.go
|── mgc0.h
|── mheap.c     内存管理实现相关,MHeap层次的数据结构和操作
|── mkversion.c
|── mprof.goc     pprof相关
|── msize.c
|── netpoll.goc
|── netpoll_epoll.c     封装了依赖到系统的epoll,对Go提供runtime.netpoll相关的函数
|── netpoll_kqueue.c
|── netpoll_stub.c
|── os_darwin.c
|── os_darwin.h
|── os_freebsd.c
|── os_freebsd.h
|── os_freebsd_arm.c
|── os_linux.c     goroutine相关,依赖于系统的部分。runtime.newosproc,runtime.minit等函数都在这里实现
|── os_linux.h
|── os_linux_386.c
|── os_linux_arm.c
|── os_netbsd.c
|── os_netbsd.h
|── os_netbsd_386.c
|── os_netbsd_amd64.c
|── os_netbsd_arm.c
|── os_openbsd.c
|── os_openbsd.h
|── os_plan9.c
|── os_plan9.h
|── os_plan9_386.c
|── os_plan9_amd64.c
|── os_windows.c
|── os_windows.h
|── os_windows_386.c
|── os_windows_amd64.c
|── panic.c
|── parfor.c     垃圾回收相关,提供了并行方面的支持
|── pprof
|   ├── pprof.go
|   └── pprof_test.go
|── print.c
|── proc.c         goroutine调度器
|── proc.p
|── proc_test.go
|── race
|   ├── README
|   ├── doc.go
|   ├── race.go
|   ├── race_darwin_amd64.syso
|   ├── race_linux_amd64.syso
|   ├── race_test.go
|   ├── race_windows_amd64.syso
|   └── testdata
|       ├── atomic_test.go
|       ├── cgo_test.go
|       ├── cgo_test_main.go
|       ├── chan_test.go
|       ├── comp_test.go
|       ├── finalizer_test.go
|       ├── io_test.go
|       ├── map_test.go
|       ├── mop_test.go
|       ├── mutex_test.go
|       ├── regression_test.go
|       ├── rwmutex_test.go
|       ├── select_test.go
|       ├── slice_test.go
|       ├── sync_test.go
|       └── waitgroup_test.go
|── race.c
|── race.go
|── race.h
|── race0.c
|── race_amd64.s
|── rt0_darwin_386.s
|── rt0_darwin_amd64.s
|── rt0_freebsd_386.s
|── rt0_freebsd_amd64.s
|── rt0_freebsd_arm.s
|── rt0_linux_386.s
|── rt0_linux_amd64.s     生成可执行文件的入口,包括main函数等
|── rt0_linux_arm.s
|── rt0_netbsd_386.s
|── rt0_netbsd_amd64.s
|── rt0_netbsd_arm.s
|── rt0_openbsd_386.s
|── rt0_openbsd_amd64.s
|── rt0_plan9_386.s
|── rt0_plan9_amd64.s
|── rt0_windows_386.s
|── rt0_windows_amd64.s
|── rune.c
|── runtime-gdb.py
|── runtime.c
|── runtime.h     几乎大部分的数据结构都是在这个文件中定义的
|── runtime1.goc
|── runtime_linux_test.go
|── runtime_test.go
|── sema.goc
|── signal_386.c
|── signal_amd64.c
|── signal_arm.c
|── signal_darwin_386.h
|── signal_darwin_amd64.h
|── signal_freebsd_386.h
|── signal_freebsd_amd64.h
|── signal_freebsd_arm.h
|── signal_linux_386.h
|── signal_linux_amd64.h
|── signal_linux_arm.h
|── signal_netbsd_386.h
|── signal_netbsd_amd64.h
|── signal_netbsd_arm.h
|── signal_openbsd_386.h
|── signal_openbsd_amd64.h
|── signal_unix.c
|── signal_unix.h
|── signals_darwin.h
|── signals_freebsd.h
|── signals_linux.h
|── signals_netbsd.h
|── signals_openbsd.h
|── signals_plan9.h
|── signals_windows.h
|── sigqueue.goc
|── slice.c     slice的底层实现
|── softfloat64.go
|── softfloat64_test.go
|── softfloat_arm.c
|── stack.c     runtime.newstack函数是这里实现的
|── stack.h     这个文件里的注释很重要,讲了Go里使用的栈结构
|── string.goc
|── string_test.go
|── symtab.c
|── symtab_test.go
|── sys_darwin_386.s
|── sys_darwin_amd64.s
|── sys_freebsd_386.s
|── sys_freebsd_amd64.s
|── sys_freebsd_arm.s
|── sys_linux_386.s
|── sys_linux_amd64.s     封装了重要的系统调用,提供runtime.xx的函数,比如runtime.read
|── sys_linux_arm.s
|── sys_netbsd_386.s
|── sys_netbsd_amd64.s
|── sys_netbsd_arm.s
|── sys_openbsd_386.s
|── sys_openbsd_amd64.s
|── sys_plan9_386.s
|── sys_plan9_amd64.s
|── sys_windows_386.s
|── sys_windows_amd64.s
|── syscall_windows.goc
|── syscall_windows_test.go
|── time.goc
|── time_plan9_386.c
|── traceback_arm.c
|── traceback_x86.c
|── type.go
|── type.h         类型系统,里面有Type结构体的定义。interface以及reflect也依赖于这里一些东西
|── typekind.h     类型系统,提供了Type中的kind编号
|── vdso_linux_amd64.c
|── vlop_386.s
|── vlop_arm.s
|── vlop_arm_test.go
|── vlrt_386.c
|── vlrt_arm.c
|── zasm_darwin_amd64.h
|── zgoarch_amd64.go
|── zgoos_darwin.go
|── zmalloc_darwin_amd64.c
|── zmprof_darwin_amd64.c
|── znetpoll_darwin_amd64.c
|── zruntime1_darwin_amd64.c
|── zruntime_defs_darwin_amd64.go
|── zsema_darwin_amd64.c
|── zsigqueue_darwin_amd64.c
|── zstring_darwin_amd64.c
|── ztime_darwin_amd64.c
|── zversion.go

参考文章

超详细Go语言源码目录说明

附录B Go的源代码目录结构

【Go基础】Go源码目录必知

相关推荐
techdashen几秒前
Go与黑客(第四部分)
开发语言·后端·golang
宇宙大豹发6 分钟前
【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)
开发语言·爬虫·python·学习·python爬虫·python代码·python使用
蓝桉柒713 分钟前
web前端开发--动画效果
开发语言·前端·css
河北小田14 分钟前
基于 Java 注解实现 WebSocket 服务器端
后端·websocket·程序员
as_jopo22 分钟前
-Dspring.profiles.active=dev与--spring.profiles.active=dev的区别
java·后端·spring
hummhumm22 分钟前
第 32 章 - Go语言 部署与运维
java·运维·开发语言·后端·python·sql·golang
techdashen23 分钟前
Go与黑客(第二部分)
开发语言·后端·golang
LightOfNight29 分钟前
一文学会Golang里拼接字符串的6种方式(性能对比)
开发语言·golang
fa_lsyk29 分钟前
Spring:AOP面向切面案例讲解AOP核心概念
java·后端·spring
2401_8784673232 分钟前
大连环保公益管理系统|Java|SSM|Vue| 前后端分离
java·开发语言·学习·tomcat·maven