Go語言的工作空間:通常添加到GOPATH中。
src
bin
pkg
對于bin和pkg兩個目錄,主要影響go install/get指令,它們會将編譯結果安裝到這兩個目錄下,以實作增量編譯。
環境變量用于實作GOPATH隻是工具鍊和标準庫的存放位置。
在使用Git等版本控制工具的時候,建議忽略pkg和bin目錄。直接在src目錄或者直接在子包目錄下建立倉庫。
導入包:必須用import指令,參數是工作空間以src為起始的絕對路徑。
除了使用預設的包名以外還可以使用别名機制來實作避免同名沖突問題。
import導入的是路徑而不是包名,import的導入方式:
1.import "github.com/test/tester" 預設的方式導入
2.import X "github.com/test/tester" 别名方式導入
3.import . "github.com/test/tester" 簡單方式導入(不建議使用,因為有可能會造成命名沖突)
4.import _ "github.com/test/tester" 初始化的方式導入
簡便方式常用于代碼測試中。未使用的包導入後會報錯,可以使用初始化方式進行忽略。
部分工具支援相對路徑。
自定義路徑:在Web伺服器上對應路徑名稱使用go-import跳轉資訊即可。
組織結構:
包名通常使用單數形式,源碼檔案必須必使用UTF-8格式,否則會導緻編譯出錯。使用go list指令可以列出包路徑。
main包:可執行的入口(入口函數:main.main)
all包:标準庫以及GOPATH中找到的所有包
std/cmd包:标準庫以及工具鍊
documentation庫:存儲文檔資訊,無法導入(和目錄名無關)
權限:所有成員在包内都能通路,無論是否在同一的源碼内,但是隻有名稱首字母大寫才會在包外可視。
初始化:
包内每個源碼檔案可以定義一個或者是多個初始化函數,但是編譯器不保證執行次序。
實際上,所有這些初始化函數(包括标準庫和導入的第三方包)都是由編譯器自動生成的一個包裝函數進行調用,是以可保證在單一線程上執行,且僅僅執行一次。執行次序和依賴關系、檔案名以及定義次序有關。
初始化函數之間不應有邏輯關聯,最好僅僅處理目前檔案的初始化操作。編譯器首先確定完成所有全局變量初始化,然後才開始執行初始化函數。如果在初始化函數中引用了全局變量,那麼這個變量最好是在定義的是時候直接指派。
因為無法保證執行的次序搜一遍任何初始化函數中的指派都有可能延遲無效。
在進行代碼重構的時候,我們會将代碼陸續的分離出來,以獨立包的形式進行維護,此時,基于首字母大小寫的通路權限控制是過于粗略的,因為我們希望這些包導出成員僅僅在特定範圍内通路,而不是向所有使用者公開的。
所儲存在internal目錄下面的包(包括自身)僅僅能被父目錄下面的包(含所有層次的子目錄)通路。
依賴管理:引入vendor的機制,專門存放第三方包,實作将源碼包和依賴完整打包分發。如果說internal針對内部,那麼vendor針對的是外部。vendor比标準庫的優先級要高。
從源檔案所在目錄開始,逐級向上構造vendor全路徑,直到發現路徑比對為止。比對失敗,則依舊搜尋GOPATH。要使用vendor機制,必須開啟"GO15VENDOREXPERIMENT=1"的環境變量,Go1.6中預設是開啟的,并且必須設定Go的工作空間。
使用go get下載下傳第三方包時,依舊使用GOPATH第一個工作空間,而不是vendor目錄,目前工具鍊中并沒有真正意義上的包依賴管理,好在有第三方工具的實作。
本文轉自 棋帥小七 51CTO部落格,原文連結:http://blog.51cto.com/xvjunjie/2055130