golang入門-- import包與包內init方法的執行時機
最近在學習revel(golang web開發框架) ,瞭解到revel管理和載入所有controller的方式。其中涉及的golang基礎知識是import包。下面我們先來看看golang imort包的幾種方法和特徵:
第一種方式相對路徑
import "./module" //當前檔案同一目錄的module目錄, 此方式沒什麼用容易出錯</span>
第二種方式絕對路徑
import “LearnGo/init” //載入gopath/src/LearnGo/init模組
下面展示一些特殊的import方式
1.點操作
我們有時候會看到如下的方式匯入包
import( . “fmt” )
這個點操作的含義就是這個包匯入之後在你呼叫這個包的函式時,你可以省略字首的包名,也就是前面你呼叫的fmt.Println("hello world")
可以省略的寫成Println("hello world")
2.別名操作
別名操作顧名思義我們可以把包命名成另一個我們用起來容易記憶的名字,revel框架的app/controllers/tmp/main.go(框架的啟動入口)裡可以看到此方式的應用。
import(
f "fmt"
)
別名操作的話呼叫包函式時字首變成了我們的字首,即f.Println("hello world")。
import (//revel框架的程式碼片段 "flag" "reflect" "github.com/revel/revel" controllers0 "github.com/revel/modules/static/app/controllers" _ "github.com/revel/modules/testrunner/app" controllers1 "github.com/revel/modules/testrunner/app/controllers" _ "guild_website/app" controllers "guild_website/app/controllers" tests "guild_website/tests" "github.com/revel/revel/testing" )
3._操作
這個操作經常是讓很多人費解的一個操作符,請看下面這個import
import (//revel框架的程式碼片段
_ "github.com/revel/modules/testrunner/app"
_ "guild_website/app"
)
_操作其實是引入該包,而不直接使用包裡面的函式,而是呼叫了該包裡面的init函式,要理解這個問題,需要看下面這個圖,理解包是怎麼按照順序載入的:
程式的初始化和執行都起始於main包。如果main包還匯入了其它的包,那麼就會在編譯時將它們依次匯入。有時一個包會被多個包同時匯入,那麼它 只會被匯入一次(例如很多包可能都會用到fmt包,但它只會被匯入一次,因為沒有必要匯入多次)。當一個包被匯入時,如果該包還匯入了其它的包,那麼會先 將其它包匯入進來,然後再對這些包中的包級常量和變數進行初始化,接著執行init函式(如果有的話),依次類推。等所有被匯入的包都載入完畢了,就會開
始對main包中的包級常量和變數進行初始化,然後執行main包中的init函式(如果存在的話),最後執行main函式。