讀源碼可以深層理解Go的編寫方式,理解作者們的思維方式;也有助于對Go語法用法深刻的理解,我們從這一篇說一下如何讀源碼,從哪些源碼著手,從
簡單到深入的方式學習源碼;
學習源碼也是一個修煉過程,來修補自己代碼上不規范的方式和更優化的方式;
查看方式
- 直接下載源碼
git clone https://github.com/golang/go.git
- 在goland或vscode中查看對應的源碼,提供了代碼導航、跳轉到定義、查找引用等功能。
閱讀方式
閱讀路線:
標準庫: 從閱讀 Go 的標準庫開始是一個不錯的選擇。標準庫是學習 Go 的核心,包括諸如 fmt、net、http 等包。
Go Runtime: 學習 Go 的運行時系統是深入理解語言的重要一步。閱讀 runtime 包和與調度器、垃圾回收器相關的代碼。
Go Tools: 了解 Go 工具鏈是一個好主意,包括 go build、go test 等。這有助于理解代碼是如何構建和測試的。
Go Compiler: 如果你對編譯器和語言的底層工作原理感興趣,可以閱讀 Go 的編譯器源碼。
Go Web 框架: 如果你對 Web 開發感興趣,可以閱讀一些知名的 Go Web 框架的源碼,比如 Gin、Echo、Beego。
Go 源碼庫: 最終,你可以嘗試閱讀更底層的 Go 源碼,如 cmd 目錄下的一些工具,以及 src 目錄下的 runtime。
更好地閱讀和理解Go的源碼:
- 閱讀測試代碼: Go項目通常會伴隨有大量的測試代碼。測試代碼對于理解一個函數或模塊的使用方法和預期行為非常有幫助。
- 閱讀示例代碼: Go的文檔中經常包含示例代碼,這些示例代碼可以幫助你理解如何正確使用某個包或函數。
- 了解Go的工具鏈: Go語言有一套強大的工具鏈,包括
go build
、go test
、go run
等。了解這些工具的使用可以幫助你理解Go項目的構建和測試流程。 - 閱讀注釋: Go語言的代碼通常包含豐富的注釋,特別是在核心庫中。這些注釋解釋了代碼的設計思想和某些實現細節。
- 深入閱讀核心庫: 如果你對Go語言的核心庫實現感興趣,可以深入閱讀
src/runtime
和src/reflect
等目錄下的源代碼。
舉例
-
Go 語言編譯器的源代碼在
src/cmd/compile
目錄中,目錄下的文件共同組成了 Go 語言的編譯器,學過編譯原理的人可能聽說過編譯器的前端和后端,編譯器的前端一般承擔著詞法分析、語法分析、類型檢查和中間代碼生成幾部分工作,而編譯器后端主要負責目標代碼的生成和優化,也就是將中間代碼翻譯成目標機器能夠運行的二進制機器碼。- Go源碼針對代碼都提供的有單元測試,有助于我們深入學習,如:
flag用于解析命令行選項,flag方法源碼:- flag.go- flag_test.gosrc/flag/flag_test.gofunc TestEverything(t *testing.T) {...m := make(map[string]*Flag)desired := "0"visitor := func(f *Flag) {if len(f.Name) > 5 && f.Name[0:5] == "test_" {m[f.Name] = fok := falseswitch {case f.Value.String() == desired:ok = truecase f.Name == "test_bool" && f.Value.String() == boolString(desired):ok = truecase f.Name == "test_duration" && f.Value.String() == desired+"s":ok = truecase f.Name == "test_func" && f.Value.String() == "":ok = true}if !ok {t.Error("Visit: bad value", f.Value.String(), "for", f.Name)}}}...}
參考
- Go 語言設計與實現
- go by example 中文版