1. 程式人生 > >02 - 理解專案結構中的包的檔案

02 - 理解專案結構中的包的檔案

一、 專案結構

1. Package

GO 語言當中的包和其他語言的庫或者模組很類似,都是為了支援模組化、封裝、單獨編譯和程式碼重用。
package的使用原則:

  1. 一個包的原始碼在一個或者多個以.go 為字尾名的原始檔當中. 例如 包 gopl/ch1/helloworld 對應的路徑就是 $GOPATH/src/gopl/ch1/helloworld;
  2. 因為每一個包必須對應一個獨立的空間 ( 通俗的理解,就是每一個包必須有一個獨立的路徑,並且那個路徑下的最後的子目錄就是必須包名 )
  3. 除了包的匯入路徑,每個包還有一個包名,包名一般是短小的名字(並不要求包名是唯一的),包名在包的宣告處指定。按照慣例,一個包的名字和包的匯入路徑的最後一個欄位相同

2. import

包的import方式

//方式一
import "pkg1"
import "pkg2"
import "pkg3"

//方式2
import (
	"pkg1"
	"pkg2"
	"pkg3"
)
  1. 如果一個main匯入其他的包,包會被順序匯入;
  2. 如果匯入的包(pkg1)依賴其他的包(包pkg2),會首先匯入pkg2,然後初始化pkg2中的常量與變數,如果pkg2中有init函式,會自動執行init;
  3. 所有包匯入完成後才會對main的常量和變數進行初始化,然後執行main中的init函式(如果有的話),最後執行main函式;
  4. 如果一個包被匯入多次實際上只會匯入一次

包引用圖

3. 運算函式庫編寫

calc 目錄結構

  • 首先我們變成了包為mathAdd 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 mainxx.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 目錄下程式設計其他運算的函式
  • 切記,包中的函式或者變數如果要在其他包中被呼叫,其首寫字母必須是大寫