Golang GOPATH 包
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
Golang GOPATH & 包的定義 & 包的導(dǎo)入
GOPATH 設(shè)置
go 命令依賴(lài)一個(gè)重要的環(huán)境變量:$GOPATH
可以在 .zshrc 配置文件中加上一行這樣的配置,
export GOPATH=/Users/flyme/mygoGo從1.1版本到1.7必須設(shè)置這個(gè)變量,而且不能和Go的安裝目錄一樣,這個(gè)目錄用來(lái)存放Go源碼,Go的可運(yùn)行文件,以及相應(yīng)的編譯之后的包文件。所以這個(gè)目錄下面有三個(gè)子目錄:src、bin、pkg
從go 1.8開(kāi)始,GOPATH環(huán)境變量現(xiàn)在有一個(gè)默認(rèn)值,如果它沒(méi)有被設(shè)置。 它在Unix上默認(rèn)為$HOME/go。
GOPATH允許多個(gè)目錄,當(dāng)有多個(gè)目錄時(shí),請(qǐng)注意分隔符,多個(gè)目錄的時(shí)候Windows是分號(hào),Linux系統(tǒng)是冒號(hào),當(dāng)有多個(gè)GOPATH時(shí),默認(rèn)會(huì)將go get的內(nèi)容放在第一個(gè)目錄下。
以上 $GOPATH 目錄約定有三個(gè)子目錄:
- src 存放源代碼(比如:.go .c .h .s等)
- pkg 編譯后生成的文件(比如:.a)
- bin 編譯后生成的可執(zhí)行文件(為了方便,可以把此目錄加入到 $PATH 變量中,如果有多個(gè)gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目錄)
.zshrc PATH 和 GOPATH 環(huán)境變量的配置?
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目錄就是接下來(lái)開(kāi)發(fā)程序的主要目錄,所有的源碼都是放在這個(gè)目錄下面,那么一般我們的做法就是一個(gè)目錄一個(gè)項(xiàng)目,例如: $GOPATH/src/mymath 表示mymath這個(gè)應(yīng)用包或者可執(zhí)行應(yīng)用,這個(gè)根據(jù)package是main還是其他來(lái)決定,main的話(huà)就是可執(zhí)行應(yīng)用,其他的話(huà)就是應(yīng)用包。
main package不同于其它library package,它定義了一個(gè)可執(zhí)行程序。其中的main函數(shù)即是可執(zhí)行文件的入口函數(shù)。
所以當(dāng)新建應(yīng)用或者一個(gè)代碼包時(shí)都是在src目錄下新建一個(gè)文件夾,文件夾名稱(chēng)一般是代碼包名稱(chēng),當(dāng)然也允許多級(jí)目錄,例如在src下面新建了目錄$GOPATH/src/github.com/astaxie/beedb 那么這個(gè)包路徑就是"github.com/astaxie/beedb",包名稱(chēng)是最后一個(gè)目錄beedb。
在每個(gè)Go源文件的開(kāi)頭都必須有包聲明語(yǔ)句。包聲明語(yǔ)句的主要目的是確定當(dāng)前包被其它包導(dǎo)入時(shí)默認(rèn)的標(biāo)識(shí)符(也稱(chēng)為包名)。
例如,math/rand包的每個(gè)源文件的開(kāi)頭都包含package rand包聲明語(yǔ)句,所以當(dāng)你導(dǎo)入這個(gè)包,你就可以用rand.Int、rand.Float64類(lèi)似的方式訪(fǎng)問(wèn)包的成員。
關(guān)于默認(rèn)包名一般采用導(dǎo)入路徑名的最后一段的約定也有三種例外情況。
第一個(gè)例外,包對(duì)應(yīng)一個(gè)可執(zhí)行程序,也就是main包,這時(shí)候main包本身的導(dǎo)入路徑是無(wú)關(guān)緊要的。名字為main的包是給go build構(gòu)建命令一個(gè)信息,這個(gè)包編譯完之后必須調(diào)用連接器生成一個(gè)可執(zhí)行程序。
第二個(gè)例外,包所在的目錄中可能有一些文件名是以test.go為后綴的Go源文件,并且這些源文件聲明的包名也是以test為后綴名的。這種目錄可以包含兩種包:一種普通包,加一種則是測(cè)試的外部擴(kuò)展包。所有以test為后綴包名的測(cè)試外部擴(kuò)展包都由go test命令獨(dú)立編譯,普通包和測(cè)試的外部擴(kuò)展包是相互獨(dú)立的。
第三個(gè)例外,一些依賴(lài)版本號(hào)的管理工具會(huì)在導(dǎo)入路徑后追加版本號(hào)信息,例如"gopkg.in/yaml.v2"。這種情況下包的名字并不包含版本號(hào)后綴,而是yaml。
?
包的導(dǎo)入聲明
如果我們想同時(shí)導(dǎo)入兩個(gè)有著名字相同的包,例如math/rand包和crypto/rand包,那么導(dǎo)入聲明必須至少為一個(gè)同名包指定一個(gè)新的包名以避免沖突。這叫做導(dǎo)入包的重命名。
import ("crypto/rand"mrand "math/rand" // alternative name mrand avoids conflict )?
包的匿名導(dǎo)入
如果只是導(dǎo)入一個(gè)包而并不使用導(dǎo)入的包將會(huì)導(dǎo)致一個(gè)編譯錯(cuò)誤。但是有時(shí)候我們只是想利用導(dǎo)入包而產(chǎn)生的副作用:它會(huì)計(jì)算包級(jí)變量的初始化表達(dá)式和執(zhí)行導(dǎo)入包的init初始化函數(shù)。這時(shí)候我們需要抑制“unused import”編譯錯(cuò)誤,我們可以用下劃線(xiàn)來(lái)重命名導(dǎo)入的包。像往常一樣,下劃線(xiàn)為空白標(biāo)識(shí)符,并不能被訪(fǎng)問(wèn)。
import _ "image/png" // register PNG decoder============END============
轉(zhuǎn)載于:https://my.oschina.net/xinxingegeya/blog/718305
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Golang GOPATH 包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [libuv] libuv安装
- 下一篇: Feign如何针对单个服务屏蔽Hystr