超詳細Go語言源碼目錄說明

開源項目「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:瀏覽器頁籤左邊的圖標,通常放在網站根目錄,就長這樣 file
  • 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語言與技術原理。 關注我

相關文章
相關標籤/搜索