區塊鏈技術語言(二十一)——Go語言包
在實際開發工作中,工程不會簡單到只有一個原始碼檔案,且原始檔之間有相互依賴的關係。Go語言利用命令列工具,消除了工程檔案的概念,完全用目錄結構和包名來推導工程結構和構建順序。
1
包的由來
為了程式碼更好地維護和複用,Go語言程式按程式的功能性將原始碼分割成一個個邏輯單元,組織成若干組檔案,每組檔案被稱為一個包。這樣開發人員可以以包為單位對程式碼進行維護;也可以以包為複用單元,引入到其他專案。
2
包名
為了方便包的定位,建議包名和目錄名一致,即以.go為檔案字尾名的原始檔,其第一行程式碼所宣告的包名和此檔案所屬的目錄名一致。則同屬一個路徑下的每個以.go為檔案字尾名的原始檔的包名一致,都和目錄名一致。
3
包的分類和匯入
Go語言將包分為四類:main包、標準庫包、程式內部包和第三方包。
3.1 main包
3.1.1 main包特點
用Go語言編譯的可執行程式,其包名必須是main,而且這個main包裡一定要有且僅有一個main()函式。如此,Go語言的編譯程式會試圖把main包編譯為二進位制的可執行檔案,而main()函式就是這個程式的入口。
3.1.2 main函式
main()函式只能在main包裡使用才是可執行函式,且main包有且僅有一個main()函式,main()函式在定義時不能有任何引數和返回值。main()函式是程式自動呼叫的,它是程式的執行起點。
3.1.3 init 函式
init()函式能夠應用於所有的包,且每個包可以有任意多個init()函式,但為了程式的可讀性和可維護性,建議每個檔案最多隻寫一個init()函式。init()函式在定義時也不能有任何的引數和返回值。init ()函式是程式自動呼叫的,它在main()函式之前執行。
在3.5中包的匯入原理中再講述main()函式和init()函式的執行順序。
3.2 標準庫包
Go程式在安裝時就已經安裝了Go語言標準庫,內置於Go語言安裝包下面的src包,它基本實現了Go語言常用功能。它的匯入格式如下:
3.3 程式內部包
程式內部包,包括下載到本地的原始碼包和自定義程式碼包。Go語言規定下載到本地的原始碼包和自定義的程式碼包都要放在GOPATH的src目錄下(或者GOPATH的src的某個子目錄下)。
在Go語言中,自定義程式碼包的程式碼檔名可以任意,但是這些檔案都必須以包宣告語句作為檔案中的第一行(建議包名和目錄名一致),每個包都對應一個獨立的名字空間,例如一個檔案的目錄名為calc,其宣告格式為:
通常一個包所在目錄路徑的字尾就是包的匯入路徑。根據路徑是否相同,將不同的檔案分為同一路徑下的不同檔案和不同路徑下的不同檔案。
3.3.1 同一路徑下的不同檔案
在Go語言程式裡,同一路徑下的多個檔案被Go語言編譯器看作是一個檔案,程式裡宣告的包名必須相同(建議包名和目錄名一致),可以直接相互引用資料(全域性變數、函式、結構體、結構體成員),不用匯入路徑。因此,在這多個檔案中不能出現相同的全域性變數名、函式名、結構體型別名、結構體成員變數名,首字母大小寫均不可以。
需要注意,同一路徑下,兩個均宣告為main包的檔案可以相互訪問對方的全域性變數、函式、結構體、結構體成員,但是不能呼叫。因為一個可執行程式只能有一個main包,雖然兩個檔案均宣告為main包,但不屬於同一個程式。一般同一個路徑宣告為main包的檔案只能有一個。
3.3.2 不同路徑下的不同檔案
不同路徑下的檔案,程式裡宣告的包名可以相同,也可以不同(根據實際開發需要而定)。但在執行程式中匯入另一個檔案中的資料,必須匯入另一個檔案所在的路徑。
假若所需要匯入的函式sort.go所在路徑為:
則在執行程式中寫入此程式碼:
3.4 包的匯入原理
如圖1所示,程式的初始化和執行都起始於main包。如果main包還匯入了其它的包,那麼就會在編譯時將它們依次匯入。當一個包被匯入時,如果該包還匯入了其它的包,那麼會先將其它包匯入進來,然後再對這些包中的包級常量和變數進行初始化,接著執行init函式(如果有的話),依次類推。等所有被匯入的包都載入完畢了,就會開始對main包中的包級常量和變數進行初始化,然後執行main包中的init函式(如果存在的話),最後執行main函式。包的匯入過程如圖1所示。
4
匯入包的程式碼呼叫
匯入包需要使用關鍵字import,即讓編譯器引入該位置的包內程式碼。包的路徑可以是相對路徑,也可以是絕對路徑。
4.1 可見性規則
如果包內(main包除外)的全域性變數名、函式名、結構體型別名、結構體成員變數名的首字母大寫,則可以被外部包訪問;如果首字母小寫,只能被同一個包裡的檔案訪問。
4.2 包中程式碼的呼叫
一個執行程式匯入了包(標準庫包、程式內部包、第三方包),未呼叫其中可被訪問的物件(首字母大寫的全域性變數名、函式名、結構體變數名、結構體成員變數名),則編譯錯誤。呼叫格式如表1所示。
包名為dcdfvfer的包路徑為:
~/go/src/workSpace/dfv/dcdfvfer,dcdfvfer包匯入main包的示例如下:
4.3 包的其他匯入方法
包的其他匯入方法包括:點操作、別名操作、下劃線操作。
4.3.1 點操作
點操作,就是這個包匯入之後,呼叫這個包的函式時可以省略字首的包名。
4.3.2 別名操作
別名操作,就是包在導⼊時,對包重新命名,呼叫包的函式時,字首使用重新命名之後的別名,不能使用原先本名。
4.3.3 _操作
在4.2中已經介紹過,如果匯入了包,則在程式中必須要呼叫該包裡可以被訪問的物件,否則編譯出錯。但有時候我們必須匯入一個包,且僅僅利用它對包級別的變數執行初始化表示式求值,並執行init函式。這個時候可以使用空白識別符號_來重新命名這個匯入:
ofollow,noindex"> 原文鏈塊:區塊鏈技術語言(二十一)
參考資料
[1] 許式偉,呂桂華.Go語言程式設計[M].北京:人民郵電出版社,2012:13.
[2] https://blog.csdn.net/konglongaa/article/details/78975456
本文完,獲取更多資訊,敬請關注區塊鏈工程師。
來源:鏈塊學院
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”