2019獨角獸企業重金招聘Python工程師標準>>>
Golang GOPATH & 包的定義 & 包的導入
GOPATH 設置
go 命令依賴一個重要的環境變量:$GOPATH
可以在 .zshrc 配置文件中加上一行這樣的配置,
export GOPATH=/Users/flyme/mygo
Go從1.1版本到1.7必須設置這個變量,而且不能和Go的安裝目錄一樣,這個目錄用來存放Go源碼,Go的可運行文件,以及相應的編譯之后的包文件。所以這個目錄下面有三個子目錄:src、bin、pkg
從go 1.8開始,GOPATH環境變量現在有一個默認值,如果它沒有被設置。 它在Unix上默認為$HOME/go。
GOPATH允許多個目錄,當有多個目錄時,請注意分隔符,多個目錄的時候Windows是分號,Linux系統是冒號,當有多個GOPATH時,默認會將go get的內容放在第一個目錄下。
以上 $GOPATH 目錄約定有三個子目錄:
- src 存放源代碼(比如:.go .c .h .s等)
- pkg 編譯后生成的文件(比如:.a)
- bin 編譯后生成的可執行文件(為了方便,可以把此目錄加入到 $PATH 變量中,如果有多個gopath,那么使用
${GOPATH//://bin:}/bin
添加所有的bin目錄)
.zshrc PATH 和 GOPATH 環境變量的配置?
export GOPATH=/Users/flyme/mygo
export PATH=$MAVEN_HOME/bin:${GOPATH//://bin:}/bin:$PATH
檢查是否配置成功,
? ~ echo $GOPATH
/Users/flyme/mygo:/Users/flyme/workspace-go
? ~ echo $PATH
/Users/flyme/IDE/apache-maven-3.3.9/bin:/Users/flyme/mygo/bin:/Users/flyme/workspace-go/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/mysql/bin
? ~
?
包的定義
GOPATH下的src目錄就是接下來開發程序的主要目錄,所有的源碼都是放在這個目錄下面,那么一般我們的做法就是一個目錄一個項目,例如: $GOPATH/src/mymath 表示mymath這個應用包或者可執行應用,這個根據package是main還是其他來決定,main的話就是可執行應用,其他的話就是應用包。
main package
不同于其它library package
,它定義了一個可執行程序。其中的main
函數即是可執行文件的入口函數。
所以當新建應用或者一個代碼包時都是在src目錄下新建一個文件夾,文件夾名稱一般是代碼包名稱,當然也允許多級目錄,例如在src下面新建了目錄$GOPATH/src/github.com/astaxie/beedb 那么這個包路徑就是"github.com/astaxie/beedb",包名稱是最后一個目錄beedb。
在每個Go源文件的開頭都必須有包聲明語句。包聲明語句的主要目的是確定當前包被其它包導入時默認的標識符(也稱為包名)。
例如,math/rand包的每個源文件的開頭都包含package rand包聲明語句,所以當你導入這個包,你就可以用rand.Int、rand.Float64類似的方式訪問包的成員。
關于默認包名一般采用導入路徑名的最后一段的約定也有三種例外情況。
第一個例外,包對應一個可執行程序,也就是main包,這時候main包本身的導入路徑是無關緊要的。名字為main的包是給go build構建命令一個信息,這個包編譯完之后必須調用連接器生成一個可執行程序。
第二個例外,包所在的目錄中可能有一些文件名是以test.go為后綴的Go源文件,并且這些源文件聲明的包名也是以test為后綴名的。這種目錄可以包含兩種包:一種普通包,加一種則是測試的外部擴展包。所有以test為后綴包名的測試外部擴展包都由go test命令獨立編譯,普通包和測試的外部擴展包是相互獨立的。
第三個例外,一些依賴版本號的管理工具會在導入路徑后追加版本號信息,例如"gopkg.in/yaml.v2"。這種情況下包的名字并不包含版本號后綴,而是yaml。
?
包的導入聲明
如果我們想同時導入兩個有著名字相同的包,例如math/rand包和crypto/rand包,那么導入聲明必須至少為一個同名包指定一個新的包名以避免沖突。這叫做導入包的重命名。
import ("crypto/rand"mrand "math/rand" // alternative name mrand avoids conflict
)
?
包的匿名導入
如果只是導入一個包而并不使用導入的包將會導致一個編譯錯誤。但是有時候我們只是想利用導入包而產生的副作用:它會計算包級變量的初始化表達式和執行導入包的init初始化函數。這時候我們需要抑制“unused import”編譯錯誤,我們可以用下劃線來重命名導入的包。像往常一樣,下劃線為空白標識符,并不能被訪問。
import _ "image/png" // register PNG decoder
============END============