目標
學習Go 的編譯方式、包的組織方式以及工具鏈的統一調用方式
概念與定義
- package
- Go 語言通過包來組織代碼。包類似于其它語言的庫librarries或模塊modules,每個包通常對應一個目錄,目錄中的所有 .go 文件都屬于同一個包。
- 特殊的 main 包 :
當代碼使用package main
聲明時,表示這是一個可獨立執行的程序而非一個庫。程序的執行入口就是main
函數
- import
- 通過 import 語句,編譯器能夠識別代碼中所需的外部依賴,若導入錯誤或缺少必要包,程序將無法編譯。這種機制保證了代碼的整潔和依賴的明確性
- 主函數 func main
func main()
是程序的執行入口。所有可執行程序都必須包含一個 main 函數。一般情況下,main 函數會調用其它函數和包中的功能來實現實際業務邏輯
- 編譯、運行與工具鏈:Go 語言是編譯型語言,它會將源碼編譯為靜態鏈接的二進制可執行文件。
- Go 語言的工具鏈將源代碼及其依賴轉換成計算機的機器指令(譯注:靜態編譯)。Go 語言提供的工具都通過一個單獨的命令?
go
?調用,go
?命令有一系列子命令。- go run:臨時編譯與執行
- 編譯一個或多個以。
.go
?結尾的源文件,鏈接庫文件,并運行最終生成的可執行文件,適合臨時實驗和調試。
- 編譯一個或多個以。
- go build:編譯生成可執行二進制文件
- 在 Linux 或 macOS 下,生成的文件名與源碼文件相同;在 Windows 下則會加上
.exe
后綴。 - 由于是靜態編譯,生成的可執行文件包含了所有依賴的代碼(go程序可以獨立運行),因此運行時無需擔心系統庫更新造成沖突或環境依賴問題,便于分發和部署。
- 在 Linux 或 macOS 下,生成的文件名與源碼文件相同;在 Windows 下則會加上
- 源碼獲取:go get。
可以自動下載源碼到$GOPATH/src/...
目錄。需要先安裝版本管理工具(如 Git 或 Hg)并設置好 GOPATH 環境變量。
- go run:臨時編譯與執行
- 自動插入分號:編譯器會根據特定符號后的換行符自動插入分號。這要求開發者在書寫代碼時注意換行位置,否則可能導致解析錯誤。
- 函數的左大括號
{
必須與函數聲明在同一行上。 - 在表達式中,換行位置也有講究:例如,在運算符
+
后換行通常不會有問題,而在運算符+
前換行則可能被錯誤地插入分號。
- 函數的左大括號
gofmt
工具會自動將代碼格式化成統一的風格- 許多文本編輯器可以配置在保存文件時自動運行
gofmt
,確保每次提交的代碼都符合標準格式。
- 許多文本編輯器可以配置在保存文件時自動運行
要點(案例)
package mainimport "fmt"func main(){fmt.Println("hello, world")
}
使用 go run helloworld.go
命令可以編譯并立即運行該程序
運行 go build helloworld.go
會編譯生成一個可執行二進制文件。
示例代碼倉庫托管在 gopl.io 上。通過 go get gopl.io/ch1/helloworld
命令,可以自動下載源碼到 $GOPATH/src/gopl.io/ch1/helloworld
目錄。需要先安裝版本管理工具(如 Git 或 Hg)并設置好 GOPATH 環境變量。
文件中 package 聲明必須位于最上方,緊隨其后的是 import 聲明。之后是函數func、變量var、常量const和類型type的聲明。雖然這些聲明的順序不影響編譯,但規范化的順序有助于代碼的可讀性和維護性。
函數的定義由 func
關鍵字開始,后面跟上函數名、參數列表、返回值列表和函數體。