前文
- golang快速入門[1]-go語言導論
- golang快速入門[2.1]-go語言開發環境配置-windows
- golang快速入門[2.2]-go語言開發環境配置-macOS
- golang快速入門[2.3]-go語言開發環境配置-linux
- golang快速入門[3]-go語言helloworld
- golang快速入門[4]-go語言如何編譯爲機器碼
- golang快速入門[5.1]-go語言是如何運行的-鏈接器
- golang快速入門[5.2]-go語言是如何運行的-內存概述
- golang快速入門[5.3]-go語言是如何運行的-內存分配
- golang快速入門[6.1]-集成開發環境-goland詳解
- golang快速入門[6.2]-集成開發環境-emacs詳解
前言
- 在之前文章中,我們介紹了go語言開發環境的配置
- 在本章中,我們將介紹go語言的項目結構、項目管理以及依賴管理。在本文中,我們關注
gopath
gopath是什麼
- 在go語言開發環境配置文章中,我們介紹了配置
gopath
與goroot
環境變量的步驟,但是並沒有對其進行深入解釋。可以在終端輸入go env
或者go env gopath
查看具體的配置
C:\Windows\system32> go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\jackson\AppData\Local\go-build
set GOENV=C:\Users\jackson\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\jackson\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=c:\go
...
- 在go1.8之後,如果不指定gopath,則gopath是默認的。
- 在mac,linux下爲`$HOME/go`
- windows 下爲`%USERPROFILE%\go`
gopath
可以理解爲go語言的工作空間,內部存儲了src
,bin
,pkg
三個文件夾
go/
├── bin
├── pkg
└── src
$GOPATH/bin
目錄存儲了通過go install
安裝的二進制文件。操作系統使用$PATH環境變量來查找無完整路徑即可執行的二進制應用程序。建議將此目錄添加到全局$PATH變量中$GOPATH/pkg
目錄中,會存儲預編譯的obj文件(文件名根據操作系統的不同而不同,例如mac下爲darwin_amd64
),以加快程序的後續編譯。大多數開發人員不需要訪問此目錄。後面還會介紹,pkg下的mod文件還會存儲go module
的依賴。$GOPATH/src
目錄 存儲我們項目的go代碼。通常包含許多版本控制存儲庫(例如,由Git管理),每個存儲庫都包含了一個或多個package,每個package都在一個目錄中包含一個或多個Go源文件。- 因此,整個路徑看起來像是:
go/
├── bin
└── main.exe
├── pkg
├── darwin_amd64
└── mod
└── src
├── github.com
│ ├── tylfin
│ │ ├── dynatomic
│ │ └── geospy
│ └── uudashr
│ └── gopkgs
└── golang.org
└── x
└── tools
- gopath具有多個作用,當我們想從github或其他地方獲取go項目代碼時,我們可以使用
go get
指令。 此時程序會默認的將代碼存儲到$GOPATH/src
目錄中。例如拉取go get github.com/dreamerjackson/theWayToGolang
時,目錄結構如下:
go/
├── bin
├── pkg
└── src
└── github.com
└── dreamerjackson
└── theWayToGolang
- 當我們使用
go get
的-u
參數時,會將該項目以及項目所依賴的所有其他項目一併下載到$GOPATH/src
目錄中 - gopath的另一個功能是明確package的導入位置。前文我們介紹過,go代碼通過package進行組織,在helloworl程序中,我們導入了go語言內置的
fmt
package.當我們要導入第三方時應該怎麼做呢?其實如果我們在項目中導入了一個第三方包,例如
import "blue/red"
實際引用的是$GOPATH/src/blue/red
文件中的代碼。
同理,如果導入爲
import "github.com/gobuffalo/buffalo"
實際引用的是$GOPATH/src/github.com/gobuffalo/buffalo
文件中的代碼。
下面我們用一個例子來說明導入第三方包
- 首先在
$GOPATH/src
中新建一個文件夾mymath
,在文件夾中新建一個文件add.go
» mkdir mymath
» cd mymath
» touch add.go
add.go的內容如下,要注意導出的函數必須是首字母大寫的,這是go語言的規則。
package mymath
func Add(a int, b int) int {
return a + b
}
接着在$GOPATH/src
中創建一個main.go文件,即可以完整的調用mymath
包中的add
函數。
package main
import (
"fmt"
"mymath"
)
func main() {
result := mymath.Add(1, 2)
fmt.Println("result:", result)
}
- 通過
go run main.go
即可運行輸出1+2
的結果3
gopath的優劣
- 相比於其他語言繁瑣的配置,go語言中的工作空間
gopath
配置相對簡單,容易理解 - gopath使得在文件系統組織整個代碼更加簡潔、結構化,但是限制在單一的工作空間中。
- gopath並沒有解決版本依賴的問題,而將其留給了其他工具去實現。正因爲如此,gopath中的代碼就是一個唯一的master分支,並且強制使用各個模塊最新的代碼。
總結
- 本文介紹了gopath的含義、功能、優劣、以及如何通過GOPATH來組織項目,導入第三方庫。
- 在go1.13之後,go官方已經開始全面擁抱
go module
.我們在下文中,將介紹go module
的原理和用法,以及如何通過go module
進行go語言的依賴管理與項目組織。