Go 的包與編譯時的依賴包查找機制

包機制

  • 同一目錄下只能存在一個包;若同一目錄下存在多個包,該目錄被別的源文件導入時編譯時會報錯,不可同一路徑導入兩個包。
  • 目錄和目錄下源文件的包命名能夠不一樣,目錄被導入時只是提供包的路徑而已;若目錄名稱和目錄下包名稱不一樣,當目錄被導入時沒必要爲包起別名便可在下文中使用包,固然,使用方式不是以目錄名爲前綴,而是以目錄下的包名爲前綴,不過這會致使讀代碼時不知道該包是來自哪一個路徑。因此通常規範的寫法是保持目錄和目錄下的包名稱相同。
  • 不一樣目錄下若存在相同名稱的包,若在一個源文件中需同時導入使用這些包,首先必定是須要導入多個目錄路徑的,因此這些來自不一樣路徑的相同名稱的包就被視爲了避免同的包,但由於名稱同樣,因此同時導入到一個源文件時會致使命名衝突編譯不經過:redeclared as imported package name previous declaration,所以這種狀況下須要給包起別名避免衝突。

編譯時的依賴包查找機制

  • Go 支持 Go Modules 以後,編譯時編譯器會從工做目錄(當前所在目錄)開始並逐級向上查找是否具備 go.mod 文件。code

    • 若是有,go.mod 文件中聲明的 module 名稱就視做 go.mod 所在的路徑,而後以指定的 main 包爲依賴入口,全部以 go.mod 中聲明的 module 名稱開頭的導入路徑都以 go.mod 所在的路徑爲相對路徑進行包的查找導入。全部須要導入的路徑中若是在 go.mod 中指定了版本,則從 $GOPATH/pkg/mod/ 下取得相應版本進行導入,若是沒有被指定則從 $GOPATH/src/$GOROOT/src/ 中進行查找導入。
    • 若是沒有,全部依賴均從 $GOPATH/src/$GOROOT/src/ 中進行查找導入。
  • 編譯時,不在意源文件在哪(只要指定入口,依賴路徑即可依次拿到),而是在意工做目錄在哪(從工做目錄開始逐級向上查找,是否能夠找到 go.mod)。
相關文章
相關標籤/搜索