zoukankan      html  css  js  c++  java
  • 你知道Golang源码各目录的作用吗?

    我是平也,这有一个专注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:浏览器页签左边的图标,一般放在网站根目录,就长这样
      file
    • 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语言与技术原理。
    关注我

  • 相关阅读:
    Flask学习目录
    Android笔记
    PyQt学习目录
    学习目录
    Python学习目录一
    sqlserver STUFF & STR
    PowerShell+Jenkins,实现项目的自动化部署
    DotNet Core Backend development
    .Net Core 类注入单元测试
    团队项目之团队展示&选题
  • 原文地址:https://www.cnblogs.com/pingyeaa/p/12715407.html
Copyright © 2011-2022 走看看