我是平也,這有一個專注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語言與技術原理,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/24391.html
標籤:Go
上一篇:golang Gin framework with websocket
下一篇:Go語言 命令列決議(一)
