咱們在寫Go代碼的時候常常用到import這個命令用來導入包文件,而咱們常常看到的方式參考以下: mysql
import( "fmt" )
而後咱們代碼裏面能夠經過以下的方式調用 git
fmt.Println("hello world")
上面這個fmt是Go語言的標準庫,他實際上是去goroot下去加載該模塊,固然Go的import還支持以下兩種方式來加載本身寫的模塊: github
相對路徑 sql
import 「./model」 //當前文件同一目錄的model目錄,可是不建議這種方式來import 函數
絕對路徑 url
import 「shorturl/model」 //加載gopath/src/shorturl/model模塊 code
上面展現了一些import經常使用的幾種方式,可是還有一些特殊的import,讓不少新手很費解,下面咱們來一一講解一下究竟是怎麼一回事 string
咱們有時候會看到以下的方式導入包 it
import( . 「fmt」 ) 這個點操做的含義就是這個包導入以後在你調用這個包的函數時,你能夠省略前綴的包名,也就是前面你調用的fmt.Println(「hello world」)能夠省略的寫成Println(「hello world」)
別名操做顧名思義咱們能夠把包命名成另外一個咱們用起來容易記憶的名字 編譯
import( f 「fmt」 ) 別名操做的話調用包函數時前綴變成了咱們的前綴,即f.Println(「hello world」)
這個操做常常是讓不少人費解的一個操做符,請看下面這個import
import ( 「database/sql」 _ 「github.com/ziutek/mymysql/godrv」 ) _操做實際上是引入該包,而不直接使用包裏面的函數,而是調用了該包裏面的init函數,要理解這個問題,須要看下面這個圖,理解包是怎麼按照順序加載的:
程序的初始化和執行都起始於main包。若是main包還導入了其它的包,那麼就會在編譯時將它們依次導入。有時一個包會被多個包同時導入,那麼它只會被導入一次(例如不少包可能都會用到fmt包,但它只會被導入一次,由於沒有必要導入屢次)。當一個包被導入時,若是該包還導入了其它的包,那麼會先將其它包導入進來,而後再對這些包中的包級常量和變量進行初始化,接着執行init函數(若是有的話),依次類推。等全部被導入的包都加載完畢了,就會開始對main包中的包級常量和變量進行初始化,而後執行main包中的init函數(若是存在的話),最後執行main函數。下圖詳細地解釋了整個執行過程:
經過上面的介紹咱們瞭解了import的時候實際上是執行了該包裏面的init函數,初始化了裏面的變量,_操做只是說該包引入了,我只初始化裏面的init函數和一些變量,可是每每這些init函數裏面是註冊本身包裏面的引擎,讓外部能夠方便的使用,就不少實現database/sql的引發,在init函數裏面都是調用了sql.Register(name string, driver driver.Driver)註冊本身,而後外部就可使用了。
這樣咱們就介紹完了所有import的狀況,但願對你理解Go的import有必定的幫助。