02 - 理解專案結構中的包的檔案
阿新 • • 發佈:2019-01-14
一、 專案結構
1. Package
GO 語言當中的包和其他語言的庫或者模組很類似,都是為了支援模組化、封裝、單獨編譯和程式碼重用。
package的使用原則:
- 一個包的原始碼在一個或者多個以.go 為字尾名的原始檔當中. 例如 包 gopl/ch1/helloworld 對應的路徑就是 $GOPATH/src/gopl/ch1/helloworld;
- 因為每一個包必須對應一個獨立的空間 ( 通俗的理解,就是每一個包必須有一個獨立的路徑,並且那個路徑下的最後的子目錄就是必須包名 )。
- 除了包的匯入路徑,每個包還有一個包名,包名一般是短小的名字(並不要求包名是唯一的),包名在包的宣告處指定。按照慣例,一個包的名字和包的匯入路徑的最後一個欄位相同
2. import
包的import方式:
//方式一
import "pkg1"
import "pkg2"
import "pkg3"
//方式2
import (
"pkg1"
"pkg2"
"pkg3"
)
- 如果一個main匯入其他的包,包會被順序匯入;
- 如果匯入的包(pkg1)依賴其他的包(包pkg2),會首先匯入pkg2,然後初始化pkg2中的常量與變數,如果pkg2中有init函式,會自動執行init;
- 所有包匯入完成後才會對main的常量和變數進行初始化,然後執行main中的init函式(如果有的話),最後執行main函式;
- 如果一個包被匯入多次實際上只會匯入一次
3. 運算函式庫編寫
- 首先我們變成了包為math的 Add Sub Mod 這三個函式
// add.go
package math
func Add(x, y int) int{
return x + y
}
//sub.go
package math
func Sub(x, y int) int {
return x - y
}
// mod.go
package math
func Mod(x, y int) int{
return x % y
}
- calcmain.go
package main
import (
"fmt"
"gopl/ch1/calc/math"
)
func main() {
var x int = 5
var y int = 7
fmt.Printf("%d + %d = %d\n", x, y, math.Add(x, y))
fmt.Printf("%d - %d = %d\n", x, y, math.Sub(x, y))
fmt.Printf("%d %% %d = %d\n", x, y, math.Mod(x, y))
}
執行結果
在 因為 package main 的 xx.go 檔案在 calcmain 目錄下面,我們可以通過以下命令來執行該程度
$ go run xx.go //直接執行
$ go build xx.go // 構建生成可執行檔案
- 如圖
二、 包和檔案分析
- 在 3 中的小實驗裡面,我們通過實現了 加減和求餘 的運算。
- 本次小實驗我們可以看做一個小專案,該專案的路徑是放在 $GOPATH/src/gopl/ch1 目錄下,在此子目錄下建立了一名為 calc 的專案,在此子目錄 (ch1目錄) 下面我們還可以建立其他目錄,後續將會有補充
- 在 calcmain.go 中, 我們引入了包
import (
"fmt"
"gopl/ch1/calc/math"
)
該包中,我們使用 gopl/ch1/calc/math 不是一個包,而是一個路徑; 該路徑下所有的包都被匯入到程式當中,但是為了方便理解我們通常都是在一個路徑下面表示一個包,而路徑的字尾就是包名 (這是golang 工程師鐵打不變的程式設計基本素質) ;
我們不推薦 引入包的時候是 import “gopl/ch1/calc/hello”, 而在使用的時候是math.xx() 這種的情況,因為引入路徑的字尾和包名不一致,這對於程式設計人員來說是非人類的存在
// calcmain.go
package main
在 calcmain.go 檔案中, 這是檔案是整個程式唯一入口, 類始於C/C++ 中的main函式一樣
總結
- 理解 import 引入路徑的字尾名和 package 之間的關係
- 理清 GOPATH 的專案檔案之間的區別
- 還可以在 math 目錄下程式設計其他運算的函式
- 切記,包中的函式或者變數如果要在其他包中被呼叫,其首寫字母必須是大寫