在工程化的Go語言開發項目中,Go語言的源碼復用是建立在包(package)基礎之上的。本文介紹了Go語言中如何定義包、如何導出包的內容及如何導入其他包。
Go語言的包(package)
包介紹
包(package)是多個Go源碼的集合,是一種高級的代碼復用方案,Go語言為我們提供了很多內置包,如fmt、os、io等。
定義包
我們還可以根據自己的需要創建自己的包。一個包可以簡單理解為一個存放.go文件的文件夾。 該文件夾下面的所有go文件都要在代碼的第一行添加如下代碼,聲明該文件歸屬的包。
package 包名
注意事項:
- 一個文件夾下面只能有一個包,同樣一個包的文件不能在多個文件夾下。
- 包名可以不和文件夾的名字一樣,包名不能包含-符號。
- 包名為main的包為應用程式的入口包,編譯時不包含main包的原始碼時不會得到可執行文件。
可見性
如果想在一個包中引用另外一個包里的標識符(如變量、常量、類型、函數等)時,該標識符必須是對外可見的(public)。在Go語言中只需要將標識符的首字母大寫就可以讓標識符對外可見了。
舉個例子, 我們定義一個包名為pkg2的包,代碼如下:
結構體中的欄位名和接口中的方法名如果首字母都是大寫,外部包可以訪問這些欄位和方法。例如:
包的導入
要在代碼中引用其他包的內容,需要使用import關鍵字導入使用的包。具體語法如下:
import "包的路徑"
注意事項:
- import導入語句通常放在文件開頭包聲明語句的下面。
- 導入的包名需要使用雙引號包裹起來。
- 包名是從$GOPATH/src/後開始計算的,使用/進行路徑分隔。
- Go語言中禁止循環導入包。
單行導入
單行導入的格式如下:
多行導入
多行導入的格式如下:
自定義包名
在導入包名的時候,我們還可以為導入的包設置別名。具體語法格式如下:
import 別名 "包的路徑"
單行導入方式定義別名:
多行導入方式定義別名:
匿名導入包
如果只希望導入包,而不使用包內部的數據時,可以使用匿名導入包。具體的格式如下:
import _ "包的路徑"
匿名導入的包與其他方式導入的包一樣都會被編譯到可執行文件中。
init()初始化函數
init()函數介紹
在Go語言程序執行時導入包語句會自動觸發包內部init()函數的調用。需要注意的是: init()函數沒有參數也沒有返回值。 init()函數在程序運行時自動被調用執行,不能在代碼中主動調用它。
包初始化執行的順序如下圖所示:
init()函數執行順序
Go語言包會從main包開始檢查其導入的所有包,每個包中又可能導入了其他的包。Go編譯器由此構建出一個樹狀的包引用關係,再根據引用順序決定編譯順序,依次編譯這些包的代碼。
在運行時,被最後導入的包會最先初始化並調用其init()函數, 如下圖示:
練習題
- 編寫一個clac包實現加減乘除四個功能函數,在snow這個包中導入並使用加減乘除四個函數實現數學運算。
原文連結:https://www.liwenzhou.com/posts/Go/11_package/
本文作者:李文周