GO 包相關

1 包編譯,eg: 引用pkgtest包windows

  • pkgtest包沒有任何編譯,項目直接導入引用,項目編譯時實際是會編譯pkgtest並在pkg\windows_386下生成pkgtest.a文件
  • 再編譯項目,因爲pkgtest已經被編譯過,因此不會從新編譯
  • 刪除pkg\windows_386下生成的pkgtest.a文件,再編譯項目,會繼續編譯pkgtest,從新在pkg\windows_386下生成新的pkgtest.a文件
  • 再編譯項目,因爲pkgtest已經被編譯過,因此不會從新編譯
  • 修改pkgtest源碼,再編譯項目,因爲pkgtest發生了變更,pkgtest包會被從新編譯,從新在pkg\windows_386下生成新的pkgtest.a文件
  • .a文件對於用戶來講,通常沒啥用,主要給編譯器加速編譯用的
  • go install只會檢查「參數指定的包所在的GOPATH」內的源碼是否有更新,若是有則從新編譯。對於依賴的其餘GOPATH下的包,若是存在已經編譯好的.a文件,則不會再檢查源碼是否有更新,不會從新編譯

 

2 import包相關函數

  • import包,編譯器會依次從$GOROOT\src和 $GOPATH\src去查找包
  • import包也支持相對路徑,好比import   "./model"  //當前文件同一目錄的model目錄,可是不建議這種方式import
  • 包的別名操做,能夠把包命名成另外一個用起來容易記憶的名字,好比import f "fmt"  而後這樣調用f.Println("xxx"),這樣能夠解決不一樣路徑下同名包的名字衝突問題
  • 包的匿名導入,好比import _ "image/png",  _操做其實只是引入該包。當導入一個包時,它全部的init()函數就會被執行,但有些時候並不是真的須要使用這些包,僅僅是但願它的init()函數被執行而已。若是不是匿名導入,則須要使用包,不然會報「unused import」編譯錯誤,爲了抑制這種錯誤,就須要匿名導入包
  • import包的初始化,當一個包被導入時,若是該包還導入了其它的包,那麼會先將其它包導入進來,而後再對這些包中的包級常量和變量進行初始化,接着執行init函數(若是有的話),依次類推。等全部被導入的包都加載完畢了,就會開始對main包中的包級常量和變量進行初始化,而後執行main包中的init函數(若是存在的話),最後執行main函數。注: 一個包能夠由多個.go文件組成,每一個go文件均可以有一個init函數進行初始化
  •  

3 GOPATH工具

  • GOPATH環境變量用於指定這樣一些目錄:除$GOROOT以外的包含Go項目源代碼和二進制文件的目錄。go install和go 工具會用到GOPATH:做爲編譯後二進制的存放目的地和import包時的搜索路徑。
  • 通常的,一個Go項目在GOPATH下,會有三個目錄(bin,pkg,src)其中,bin存放編譯後的可執行文件;pkg存放編譯後的包文件,通常是.a文件;src存放項目源文件。通常,bin和pkg目錄能夠不建立,go命令會自動建立(如 go install),只須要建立src目錄便可
相關文章
相關標籤/搜索