新聞中心
GOPATH 是 Go語(yǔ)言中使用的一個(gè)環(huán)境變量,它使用絕對(duì)路徑提供項(xiàng)目的工作目錄。

創(chuàng)新互聯(lián)建站專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站建設(shè)、泌陽(yáng)網(wǎng)絡(luò)推廣、成都微信小程序、泌陽(yáng)網(wǎng)絡(luò)營(yíng)銷(xiāo)、泌陽(yáng)企業(yè)策劃、泌陽(yáng)品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供泌陽(yáng)建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
工作目錄是一個(gè)工程開(kāi)發(fā)的相對(duì)參考目錄,好比當(dāng)你要在公司編寫(xiě)一套服務(wù)器代碼,你的工位所包含的桌面、計(jì)算機(jī)及椅子就是你的工作區(qū)。工作區(qū)的概念與工作目錄的概念也是類(lèi)似的。如果不使用工作目錄的概念,在多人開(kāi)發(fā)時(shí),每個(gè)人有一套自己的目錄結(jié)構(gòu),讀取配置文件的位置不統(tǒng)一,輸出的二進(jìn)制運(yùn)行文件也不統(tǒng)一,這樣會(huì)導(dǎo)致開(kāi)發(fā)的標(biāo)準(zhǔn)不統(tǒng)一,影響開(kāi)發(fā)效率。
GOPATH 適合處理大量 Go語(yǔ)言源碼、多個(gè)包組合而成的復(fù)雜工程。
提示
C、 C++、 Java、 C# 及其他語(yǔ)言發(fā)展到后期,都擁有自己的 IDE(集成開(kāi)發(fā)環(huán)境),并且工程(Project)、解決方案(Solution)和工作區(qū)(Workspace)等概念將源碼和資源組織了起來(lái),方便編譯和輸出。
使用命令行查看GOPATH信息
在《 安裝Go語(yǔ)言開(kāi)發(fā)包》一節(jié)中我們已經(jīng)介紹過(guò) Go語(yǔ)言的安裝方法。在安裝過(guò) Go 開(kāi)發(fā)包的操作系統(tǒng)中,可以使用命令行查看 Go 開(kāi)發(fā)包的環(huán)境變量配置信息,這些配置信息里可以查看到當(dāng)前的 GOPATH 路徑設(shè)置情況。在命令行中運(yùn)行
go env后,命令行將提示以下信息:
$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/davy/go"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
命令行說(shuō)明如下:
- 第 1 行,執(zhí)行 go env 指令,將輸出當(dāng)前 Go 開(kāi)發(fā)包的環(huán)境變量狀態(tài)。
- 第 2 行,GOARCH 表示目標(biāo)處理器架構(gòu)。
- 第 3 行,GOBIN 表示編譯器和鏈接器的安裝位置。
- 第 7 行,GOOS 表示目標(biāo)操作系統(tǒng)。
- 第 8 行,GOPATH 表示當(dāng)前工作目錄。
- 第 10 行,GOROOT 表示 Go 開(kāi)發(fā)包的安裝目錄。
從命令行輸出中,可以看到 GOPATH 設(shè)定的路徑為:/home/davy/go(davy 為筆者的用戶(hù)名)。
在 Go 1.8 版本之前,GOPATH 環(huán)境變量默認(rèn)是空的。從 Go 1.8 版本開(kāi)始,Go 開(kāi)發(fā)包在安裝完成后,將 GOPATH 賦予了一個(gè)默認(rèn)的目錄,參見(jiàn)下表。
| 平 臺(tái) | GOPATH 默認(rèn)值 | 舉 例 |
|---|---|---|
| Windows 平臺(tái) | %USERPROFILE%/go | C:\Users\用戶(hù)名\go |
| Unix 平臺(tái) | $HOME/go | /home/用戶(hù)名/go |
使用GOPATH的工程結(jié)構(gòu)
在 GOPATH 指定的工作目錄下,代碼總是會(huì)保存在 $GOPATH/src 目錄下。在工程經(jīng)過(guò) go build、go install 或 go get 等指令后,會(huì)將產(chǎn)生的二進(jìn)制可執(zhí)行文件放在 $GOPATH/bin 目錄下,生成的中間緩存文件會(huì)被保存在 $GOPATH/pkg 下。
如果需要將整個(gè)源碼添加到版本管理工具(Version Control System,VCS)中時(shí),只需要添加 $GOPATH/src 目錄的源碼即可。bin 和 pkg 目錄的內(nèi)容都可以由 src 目錄生成。
設(shè)置和使用GOPATH
本節(jié)以 Linux 為演示平臺(tái),為大家演示使用 GOPATH 的方法。
1) 設(shè)置當(dāng)前目錄為GOPATH
選擇一個(gè)目錄,在目錄中的命令行中執(zhí)行下面的指令:
export GOPATH=`pwd`
該指令中的 pwd 將輸出當(dāng)前的目錄,使用反引號(hào)
`將 pwd 指令括起來(lái)表示命令行替換,也就是說(shuō),使用
`pwd`將獲得 pwd 返回的當(dāng)前目錄的值。例如,假設(shè)你的當(dāng)前目錄是“/home/davy/go”,那么使用
`pwd`將獲得返回值“/home/davy/go”。
使用 export 指令可以將當(dāng)前目錄的值設(shè)置到環(huán)境變量 GOPATH中。
2) 建立GOPATH中的源碼目錄
使用下面的指令創(chuàng)建 GOPATH 中的 src 目錄,在 src 目錄下還有一個(gè) hello 目錄,該目錄用于保存源碼。
mkdir -p src/hello
mkdir 指令的 -p 可以連續(xù)創(chuàng)建一個(gè)路徑。
3) 添加main.go源碼文件
使用 Linux 編輯器將下面的源碼保存為 main.go 并保存到 $GOPATH/src/hello 目錄下。
package main
import "fmt"
func main(){
fmt.Println("hello")
}
4) 編譯源碼并運(yùn)行
此時(shí)我們已經(jīng)設(shè)定了 GOPATH,因此在 Go語(yǔ)言中可以通過(guò) GOPATH 找到工程的位置。
在命令行中執(zhí)行如下指令編譯源碼:
go install hello
編譯完成的可執(zhí)行文件會(huì)保存在 $GOPATH/bin 目錄下。
在 bin 目錄中執(zhí)行 ./hello,命令行輸出如下:
hello world
在多項(xiàng)目工程中使用GOPATH
在很多與 Go語(yǔ)言相關(guān)的書(shū)籍、文章中描述的 GOPATH 都是通過(guò)修改系統(tǒng)全局的環(huán)境變量來(lái)實(shí)現(xiàn)的。然而,根據(jù)筆者多年的 Go語(yǔ)言使用和實(shí)踐經(jīng)驗(yàn)及周邊朋友、同事的反饋,這種設(shè)置全局 GOPATH 的方法可能會(huì)導(dǎo)致當(dāng)前項(xiàng)目錯(cuò)誤引用了其他目錄的 Go 源碼文件從而造成編譯輸出錯(cuò)誤的版本或編譯報(bào)出一些無(wú)法理解的錯(cuò)誤提示。
比如說(shuō),將某項(xiàng)目代碼保存在 /home/davy/projectA 目錄下,將該目錄設(shè)置為 GOPATH。隨著開(kāi)發(fā)進(jìn)行,需要再次獲取一份工程項(xiàng)目的源碼,此時(shí)源碼保存在 /home/davy/projectB 目錄下,如果此時(shí)需要編譯 projectB 目錄的項(xiàng)目,但開(kāi)發(fā)者忘記設(shè)置 GOPATH 而直接使用命令行編譯,則當(dāng)前的 GOPATH 指向的是 /home/davy/projectA 目錄,而不是開(kāi)發(fā)者編譯時(shí)期望的 projectB 目錄。編譯完成后,開(kāi)發(fā)者就會(huì)將錯(cuò)誤的工程版本發(fā)布到外網(wǎng)。
因此,建議大家無(wú)論是使用命令行或者使用集成開(kāi)發(fā)環(huán)境編譯 Go 源碼時(shí),GOPATH 跟隨項(xiàng)目設(shè)定。在 Jetbrains 公司的 GoLand 集成開(kāi)發(fā)環(huán)境(IDE)中的 GOPATH 設(shè)置分為全局 GOPATH 和項(xiàng)目 GOPATH,如下圖所示。
圖:全局和項(xiàng)目GOPATH
圖中的 Global GOPATH 代表全局 GOPATH,一般來(lái)源于系統(tǒng)環(huán)境變量中的 GOPATH;Project GOPATH 代表項(xiàng)目所使用的 GOPATH,該設(shè)置會(huì)被保存在工作目錄的 .idea 目錄下,不會(huì)被設(shè)置到環(huán)境變量的 GOPATH 中,但會(huì)在編譯時(shí)使用到這個(gè)目錄。建議在開(kāi)發(fā)時(shí)只填寫(xiě)項(xiàng)目 GOPATH,每一個(gè)項(xiàng)目盡量只設(shè)置一個(gè) GOPATH,不使用多個(gè) GOPATH 和全局的 GOPATH。
提示
Visual Studio 早期在設(shè)計(jì)時(shí),允許 C++ 語(yǔ)言在全局擁有一個(gè)包含路徑。當(dāng)一個(gè)工程多個(gè)版本的編譯,或者兩個(gè)項(xiàng)目混雜有不同的共享全局包含時(shí),會(huì)發(fā)生難以察覺(jué)的錯(cuò)誤。在新版本 Visual Studio 中已經(jīng)廢除了這種全局包含的路徑設(shè)計(jì),并建議開(kāi)發(fā)者將包含目錄與項(xiàng)目關(guān)聯(lián)。
Go語(yǔ)言中的 GOPATH 也是一種類(lèi)似全局包含的設(shè)計(jì),因此鑒于 Visual Studio 在設(shè)計(jì)上的失誤,建議開(kāi)發(fā)者不要設(shè)置全局的 GOPATH,而是隨項(xiàng)目設(shè)置 GOPATH。
分享標(biāo)題:創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言GOPATH詳解(Go語(yǔ)言工作目錄)
網(wǎng)站路徑:http://fisionsoft.com.cn/article/cddihep.html


咨詢(xún)
建站咨詢(xún)
