您好,登錄后才能下訂單哦!
一、GOROOT介紹
在安裝完Golang語言的時候,所謂的安裝路徑其實就是你的GOROOT
路徑,也就是說GOROOT
存放的Golang語言內建的程式庫的所在位置,而通常你安裝完后,你電腦的環境變數就會設好GOROOT
路徑,當你開發Golang程式的時候,當你import
內建的程式庫的時候,并不需要額外安裝,而當程式運行后,預設也會先去GOROOT
路徑下尋找相對應的程式庫來運行。
1、查看Glang環境變量
go env
env
中有些是我已經修改過的,通常如果你是初次安裝Golang語言并且沒做什么環境變數設定的話,GOROOT
設定路徑就是你當初安裝Golang語言的路徑,而GOPATH
通常預設會是使用者目錄下的go
資料夾。
2、使用 go run 執行某個文件
package main import ( "fmt" ) func main() { fmt.Println("hello world") }
然后再執行以下指令:
go run main.go
就會成功輸出hello world
,go run
其實會幫你將程式碼進行編譯并產生執行檔,而編譯檔跟執行檔事實上是存在一個暫存資料夾里面,當運行完此程式就會自動刪除。該指令可以想成類似直譯的方式運行,而不需要做其他任何環境設定,即可運行。
3、引用第三方套件
package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.Run() }
import
了一個github.com/gin-gonic/gin
套件,這個是別人開發的Web Framework套件,是不存在于官方程式庫的,而是放在GitHub上的第三方套件。
GOROOT
路徑下的src
資料夾找同等于我們在程式碼中import
的路徑下去找有沒有gin
這個資料夾,而這資料夾里面就是包含了所有有關于該套件的程式庫。GOROOT
路徑下沒有找到,則會往GOPATH
路徑下的src資料夾找同等于我們在程式碼中import
的路徑下去找有沒有gin
這個資料夾。所以只要GOROOT
跟GOPATH
路徑下都沒有找到該套件的話,就無法執行該程式碼。
二、GOPATH介紹
根據上面GOROOT的介紹,我們可以知道官方的程式庫所在位置就是在GOROOT里面,而GOPATH就是專門存放第三方套件以供我們程式碼的需要。那通常開發Golang的話,通常會在重新設定GOPATH的位置。
1、GOPATH目錄
bin pkg src
依照Golang語言的慣例(強制),GOPATH是指src路徑的上一層,我們要在GOPATH路徑下主動新增src資料夾,所謂src就是代表source code的意思,也就是放我們開發Golang程式碼的相關專案的原始碼。
2、GOPATH的缺點
第三方套件只要不是官方程式庫,都需要放置在GOPATH/src
的路徑下才可以使用。
go get最常用在當我們想用別人公開在GitHub上的套件,可以幫我們從網路上clone到GOPATH/src
里面。雖然這樣很方便,但是你會發現GOPATH/src
下的程式碼會很復雜,除了有你自己開發的專案資料夾,也包含其他第三方程式庫的專案資料夾。
再來,如果你開發的專案采用第三方套件是不同版本怎么辦?以往的解決方法是要設定多組不同的GOPATH。雖然社群也有開發相對應的package manager
,如Vendor
、Dep
來解決該問題,但畢竟不是官方主導的。
三、Go Modules的誕生
為了解決不被GOPATH的問題,因此官方在1.11開始推出了Go Modules的功能。Go Modules解決方式很像是Java看到Maven的做法,將第三方程式庫儲存在本地的空間,并且給程式去引用。
1、設定GO111MODULE環境變數
總共可以三種不同的值:
默認值,go命令會根據當前目錄來決定是否啟用modules功能。需要滿足兩種情形:
該專案目錄不在GOPATH/src/
下
當前或上一層目錄存在go.mod檔案
go命令會使用modules,而不會GOPATH目錄下查找。
go命令將不會支持module功能,尋找套件如以前GOPATH的做法去尋找。
我是建議要開發Go專案就不再使用GOPATH的功能了,而是采用Go Modules的做法,因此建議都設定為on。
而采用Go Modules,下載下來的第三方套件都在哪呢?其實就位在GOPATH/pkg/mod
資料夾里面。
2、初始化mod
go mod init <module name>
<module name>
可填可不填,不填的話預設就是采用專案資料夾的名稱。
在此檔案內可以寫以下幾個關鍵字:
定義模組路徑
定義go語言version
指定依賴的套件,預設是最新版,可以指定版本號
排除該套件和其版本
使用不同的套件版本并替換原有的套件版本注解
// 單行注解
/* 多行注解*/
indirect 代表被間接導入的依賴包
假設現在我要引入GitHub上的gin-gonic/gin
的套件,如下定義:
module awesomeProject go 1.13 require github.com/gin-gonic/gin v1.6.3
再執行以下指令:
go mod download
會將需要的套件安裝在GOPATH/pkg/mod
資料夾里面。而且會發現出現一個go.sum的檔案,這個檔案基本上用來記錄套件版本的關系,確保是正確的,是不太需要理會的。
官方說明:除了go.mod之外,go命令還維護一個名為go.sum的文件,其中包含特定模塊版本內容的預期加密哈希
go命令使用go.sum文件確保這些模塊的未來下載檢索與第一次下載相同的位,以確保項目所依賴的模塊不會出現意外更改,無論是出于惡意、意外還是其他原因。 go.mod和go.sum都應檢入版本控制。
go.sum 不需要手工維護,所以可以不用太關注。
如果將gin版本改成v1.4.0再重新執行go mod download
,就會發現在GOPATH/pkg/mod
里面gin-gonic
會有兩個資料夾分別是gin@v1.4.0
、gin@v1.5.0
,借此來區分版本。
當然其實也可以不執行go mod download,而直接運行go build or go install 也會自動將套件安裝在相對應的地方。
還有一種方式直接下載套件而不用在go.mod中定義:
go get github.com/gin-gonic/gin@v1.5.0
只要有開啟go modules
功能,go get
就不會像以前一樣在GOPATH/src
下放置套件檔案,而是會放在GOPATH/pkg/mod
里面,并且go.mod
會寫好引入,這樣也就不用使用go mod download
指令了。
到此這篇關于解析GOROOT、GOPATH、Go-Modules-三者的關系的文章就介紹到這了,更多相關GOROOT GOPATH Go-Modules內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。