C語言中文網 目錄

Go語言GOPATH詳解(Go語言工作目錄)

GOPATH 是 Go 語言中使用的一個環境變量,它使用絕對路徑提供項目的工作目錄。

工作目錄是一個工程開發的相對參考目錄,好比當你要在公司編寫一套服務器代碼,你的工位所包含的桌面、計算機及椅子就是你的工作區。工作區的概念與工作目錄的概念也是類似的。如果不使用工作目錄的概念,在多人開發時,每個人有一套自己的目錄結構,讀取配置文件的位置不統一,輸出的二進制運行文件也不統一,這樣會導致開發的標準不統一,影響開發效率。

GOPATH 適合處理大量 Go 語言源碼、多個包組合而成的復雜工程。

提示

C、C++JavaC# 及其他語言發展到后期,都擁有自己的 IDE(集成開發環境),并且工程(Project)、解決方案(Solution)和工作區(Workspace)等概念將源碼和資源組織了起來,方便編譯和輸出。

使用命令行查看GOPATH信息

在《安裝Go語言開發包》一節中我們已經介紹過 Go 語言的安裝方法。在安裝過 Go 開發包的操作系統中,可以使用命令行查看 Go 開發包的環境變量配置信息,這些配置信息里可以查看到當前的 GOPATH 路徑設置情況。在命令行中運行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"

命令行說明如下:
  • 第 1 行,執行 go env 指令,將輸出當前 Go 開發包的環境變量狀態。
  • 第 2 行,GOARCH 表示目標處理器架構。
  • 第 3 行,GOBIN 表示編譯器和鏈接器的安裝位置。
  • 第 7 行,GOOS 表示目標操作系統。
  • 第 8 行,GOPATH 表示當前工作目錄。
  • 第 10 行,GOROOT 表示 Go 開發包的安裝目錄。

從命令行輸出中,可以看到 GOPATH 設定的路徑為:/home/davy/go(davy 為筆者的用戶名)。

在 Go 1.8 版本之前,GOPATH 環境變量默認是空的。從 Go 1.8 版本開始,Go 開發包在安裝完成后,將 GOPATH 賦予了一個默認的目錄,參見下表。

GOPATH 在不同平臺上的安裝路徑
平  臺 GOPATH 默認值 舉 例
Windows 平臺 %USERPROFILE%/go C:\Users\用戶名\go
Unix 平臺 $HOME/go /home/用戶名/go

使用GOPATH的工程結構

在 GOPATH 指定的工作目錄下,代碼總是會保存在 $GOPATH/src 目錄下。在工程經過 go build、go install 或 go get 等指令后,會將產生的二進制可執行文件放在 $GOPATH/bin 目錄下,生成的中間緩存文件會被保存在 $GOPATH/pkg 下。

如果需要將整個源碼添加到版本管理工具(Version Control System,VCS)中時,只需要添加 $GOPATH/src 目錄的源碼即可。bin 和 pkg 目錄的內容都可以由 src 目錄生成。

設置和使用GOPATH

本節以 Linux 為演示平臺,為大家演示使用 GOPATH 的方法。

1) 設置當前目錄為GOPATH

選擇一個目錄,在目錄中的命令行中執行下面的指令:

export GOPATH=`pwd`

該指令中的 pwd 將輸出當前的目錄,使用反引號`將 pwd 指令括起來表示命令行替換,也就是說,使用`pwd`將獲得 pwd 返回的當前目錄的值。例如,假設你的當前目錄是“/home/davy/go”,那么使用`pwd`將獲得返回值“/home/davy/go”。

使用 export 指令可以將當前目錄的值設置到環境變量 GOPATH中。

2) 建立GOPATH中的源碼目錄

使用下面的指令創建 GOPATH 中的 src 目錄,在 src 目錄下還有一個 hello 目錄,該目錄用于保存源碼。

mkdir -p src/hello

mkdir 指令的 -p 可以連續創建一個路徑。

3) 添加main.go源碼文件

使用 Linux 編輯器將下面的源碼保存為 main.go 并保存到 $GOPATH/src/hello 目錄下。
package main

import "fmt"

func main(){
    fmt.Println("hello")
}

4) 編譯源碼并運行

此時我們已經設定了 GOPATH,因此在 Go 語言中可以通過 GOPATH 找到工程的位置。

在命令行中執行如下指令編譯源碼:

go install hello

編譯完成的可執行文件會保存在 $GOPATH/bin 目錄下。

在 bin 目錄中執行 ./hello,命令行輸出如下:
hello world

在多項目工程中使用GOPATH

在很多與 Go 語言相關的書籍、文章中描述的 GOPATH 都是通過修改系統全局的環境變量來實現的。然而,根據筆者多年的 Go 語言使用和實踐經驗及周邊朋友、同事的反饋,這種設置全局 GOPATH 的方法可能會導致當前項目錯誤引用了其他目錄的 Go 源碼文件從而造成編譯輸出錯誤的版本或編譯報出一些無法理解的錯誤提示。

比如說,將某項目代碼保存在 /home/davy/projectA 目錄下,將該目錄設置為 GOPATH。隨著開發進行,需要再次獲取一份工程項目的源碼,此時源碼保存在 /home/davy/projectB 目錄下,如果此時需要編譯 projectB 目錄的項目,但開發者忘記設置 GOPATH 而直接使用命令行編譯,則當前的 GOPATH 指向的是 /home/davy/projectA 目錄,而不是開發者編譯時期望的 projectB 目錄。編譯完成后,開發者就會將錯誤的工程版本發布到外網。

因此,建議大家無論是使用命令行或者使用集成開發環境編譯 Go 源碼時,GOPATH 跟隨項目設定。在 Jetbrains 公司的 GoLand 集成開發環境(IDE)中的 GOPATH 設置分為全局 GOPATH 和項目 GOPATH,如下圖所示。


圖:全局和項目GOPATH

圖中的 Global GOPATH 代表全局 GOPATH,一般來源于系統環境變量中的 GOPATH;Project GOPATH 代表項目所使用的 GOPATH,該設置會被保存在工作目錄的 .idea 目錄下,不會被設置到環境變量的 GOPATH 中,但會在編譯時使用到這個目錄。建議在開發時只填寫項目 GOPATH,每一個項目盡量只設置一個 GOPATH,不使用多個 GOPATH 和全局的 GOPATH。

提示

Visual Studio 早期在設計時,允許 C++ 語言在全局擁有一個包含路徑。當一個工程多個版本的編譯,或者兩個項目混雜有不同的共享全局包含時,會發生難以察覺的錯誤。在新版本 Visual Studio 中已經廢除了這種全局包含的路徑設計,并建議開發者將包含目錄與項目關聯。

Go 語言中的 GOPATH 也是一種類似全局包含的設計,因此鑒于 Visual Studio 在設計上的失誤,建議開發者不要設置全局的 GOPATH,而是隨項目設置 GOPATH。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo