1. 程式人生 > >golang匯入包的幾個說明:import

golang匯入包的幾個說明:import

匯入包:

  • 標準包使用的是給定的短路徑,如"fmt"、"net/http"
  • 自己的包,需要在工作目錄(GOPATH)下指定一個目錄,improt 匯入包,實際上就是基於工作目錄的資料夾目錄

匯入包的多種方式:

  • 直接根據$GOPATH/src目錄匯入import "test/lib"(路徑其實是$GOPATH/src/test/lib)
  • 別名匯入:import alias_name "test/lib" ,這樣使用的時候,可以直接使用別名
  • 使用點號匯入:import . "test/lib",作用是使用的時候直接省略包名
  • 使用下劃線匯入:improt _ "test/lib",該操作其實只是引入該包。當匯入一個包時,它所有的init()函式就會被執行,但有些時候並非真的需要使用這些包,僅僅是希望它的init()函式被執行而已。這個時候就可以使用_操作引用該包。即使用_操作引用包是無法通過包名來呼叫包中的匯出函式,而是隻是為了簡單的呼叫其init函式()。往往這些init函式裡面是註冊自己包裡面的引擎,讓外部可以方便的使用,例如實現database/sql的包,在init函式裡面都是呼叫了sql.Register(name string, driver driver.Driver)註冊自己,然後外部就可以使用了。
  • 相對路徑匯入     import   "./model"  //當前檔案同一目錄的model目錄,但是不建議這種方式import

包的匯入過程說明:      

  程式的初始化和執行都起始於main包。如果main包還匯入了其它的包,那麼就會在編譯時將它們依次匯入。有時一個包會被多個包同時匯入,那麼它只會被匯入一次(例如很多包可能都會用到fmt包,但它只會被匯入一次,因為沒有必要匯入多次)。當一個包被匯入時,如果該包還匯入了其它的包,那麼會先將其它包匯入進來,然後再對這些包中的包級常量和變數進行初始化,接著執行init函式(如果有的話),依次類推。等所有被匯入的包都載入完畢了,就會開始對main包中的包級常量和變數進行初始化,然後執行main包中的init函式(如果存在的話),最後執行main函式。下圖詳細地解釋了整個執行過程:

 

注意:

import 匯入 Go 包有幾種方式,用途不同。 程式碼統一儲存在工作目錄下,工作目錄裡邊會有很多個包,不同包按目錄組織,包下面由多個程式碼檔案組成。匯入包時按包的唯一路徑進行匯入,匯入的包預設是必須要使用,如果不使用則編譯失敗,需要移除,減少不必要程式碼的引入,當然還有其他使用場景。預設情況下,我們使用檔名做為包名,方便理解。不同包組織不同的功能實現,方便理解。

 

編譯時使用的是包原始碼還是.a?

  一個非main包在編譯後會生成一個.a檔案(在臨時目錄下生成,除非使用go install安裝到$GOROOT或$GOPATH下,否則你看不到.a),用於後續可執行程式連結使用。比如Go標準庫中的包對應的原始碼部分路徑在:$GOROOT/src,而標準庫中包編譯後的.a檔案路徑在$GOROOT/pkg/darwin_amd64下。一個奇怪的問題在我腦袋中升騰起來,編譯時,編譯器到底用的是.a還是原始碼?

  • 在使用第三方包的時候,當原始碼和.a均已安裝的情況下,編譯器連結的是原始碼。而所謂的使用第三方包原始碼,實際上是連結了以該最新原始碼編譯的臨時目錄下的.a檔案而已。
  • Go標準庫中的包也是這樣麼?對於標準庫,比如fmt而言,編譯時,到底使用的時$GOROOT/src下原始碼還是$GOROOT/pkg下已經編譯好的.a呢?不過與自定義包不同的是,即便你修改了fmt包的原始碼(未重新編譯GO安裝包),使用者原始碼編譯時,也不會嘗試重新編譯fmt包的,依舊只是在連結時連結已經編譯好的fmt.a

Go語言中import後面路徑中最後的一個元素到底是包名還是路徑名?

  • import後面的最後一個元素應該是路徑,就是目錄,並非包名。但是很多時候,這個路徑名字和包名字相同
  • import m "lib/math"  m指代的是lib/math路徑下唯一的那個包 ,編譯器在這個路徑下如果發現了兩個包,是不允許的,編譯報錯

 

1、https://yushuangqi.com/blog/2016/understanding-golang-import-package.html

2、https://blog.csdn.net/zhangzhebjut/article/details/25564457

3、https://tonybai.com/2015/03/09/understanding-import-packages/