我是平也,這有一個專一Gopher技術與成長的開源項目「go home」php
學習Go語言源碼的第一步就是了解先了解它的目錄結構,你對它的源碼目錄瞭解多少呢?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
該目錄中的每一個文件都是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
歸檔文件處理庫,能夠用來處理tar與zip類型文件。linux
主要用於文本的讀取寫入,對io.Reader和io.Writer進行了實現和封裝,提供了比較便利的方法操做文件。git
定義了經常使用了內置類型、函數和接口,好比make、new、len、error等。github
定義了用來操做字節的函數。golang
提供了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
下面列舉出幾個比較經常使用的工具:算法
壓縮、解壓工具,支持bzip二、flate、gzip、lzw、zlib等格式。shell
提供了雙向鏈表(list)、堆(heap)、環形聯表(ring)的數據結構的操做。
一般在goroutine切換執行時,須要知道相關狀態信息才能執行,而這些信息就被封裝在context中,它的使用在Go語言中十分普遍。
封裝了不少加解密算法,好比rsa、sha一、aes、md5等函數。
提供了各類數據庫的通用API,好比SQLite、MySQL、Postgres。
支持Go程序調試。
封裝了各種編碼的實現,好比base6四、json、xml、hex等。
. ├── ascii85 ├── asn1 ├── base32 ├── base64 ├── binary ├── csv ├── encoding.go ├── gob ├── hex ├── json ├── pem └── xml 11 directories, 1 file
是咱們常用的錯誤函數,也能夠自定義。
提供了一系列標準接口,能夠經過HTTP的方式將服務器的變量以JSON格式打印出來。
解析處理命令行參數的工具。
封裝了各類格式化輸出方法。
封裝了crc3二、crc64在內的哈希函數。
HTML模板引擎,能夠將代碼與HTML混合在一塊兒,它會負責解析轉義,相似python的jinja、php的smarty等。
通常語言都會有的圖像處理庫。
用來實現字符串高速匹配查找。
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導入,不然會報錯。
爲文件I/O提供了一些基本的接口,bufio就對它進行了實現。
封裝了日誌記錄方法,好比log.Fatal、log.Print等。
封裝了基本的數學相關的函數。
封裝了MIME類型的解析,MIME是媒體類型,好比文檔、文件、字節流性質的格式。
封裝了各類網絡IO的函數,好比TCP、UDP、Socket等。
封裝了用來操做操做系統的命令,好比調用exec能夠執行shell腳本等,固然它支持不一樣平臺的操做。
實現了用於處理斜槓分隔符路徑的函數。
Go1.8版本之後提供的插件機制,能夠動態地加載動態連接庫文件.so,這樣對外發布動態連接庫就不須要把源碼給到對方進行編譯了。
封裝反射讀取方法,好比讀取結構體的方法、屬性等。
封裝了正則表達式的實現。
包含了Go運行時的操做,這塊水很深,這裏目前再也不展開陳述。
封裝了部分排序算法。
封裝了基礎類型與字符串互相轉換的方法,好比int轉string,反之亦然。
封裝了字符串操做的相關方法。
封裝了基本的同步機制,各類鎖的實現。
封裝了一系列系統調用的接口。
爲Go語言測試程序提供支持。
封裝了文本處理相關的方法,好比文本掃描或文本標籤過濾器等。
封裝了時間處理相關的函數,好比獲取當前時間,計算時間差等。
封裝了utf八、utf16的編解碼方法。
用於一些不安全的操做場景,好比正常狀況下,指向不一樣類型數據的指針是沒法互相轉換的,可是就能夠用unsafe的Pointer方法來實現,因此應該要謹慎使用。
感謝你們的觀看,若是以爲文章對你有所幫助,歡迎關注公衆號「平也」,聚焦Go語言與技術原理。