徹底搞懂golang的GOROOT和GOPATH


目錄

1、GOPATH 和 GOROOT

2、修改 GOPATH 和 GOROOT

3、HelloWord——GOPATH版

4、一些踩坑經驗

1、GOPATH 和 GOROOT
不同於其他語言,go中沒有項目的說法,只有包, 其中有兩個重要的路徑,GOROOT 和 GOPATH

Go開發相關的環境變量如下:

GOROOT:GOROOT就是Go的安裝目錄,(類似於java的JDK)
GOPATH:GOPATH是我們的工作空間,保存go項目代碼和第三方依賴包
GOPATH可以設置多個,其中,第一個將會是默認的包目錄,使用 go get 下載的包都會在第一個path中的src目錄下,使用 go install時,在哪個GOPATH中找到了這個包,就會在哪個GOPATH下的bin目錄生成可執行文件

2、修改 GOPATH 和 GOROOT
GOROOT
GOROOT是Go的安裝路徑。GOROOT在絕大多數情況下都不需要修改

Mac中安裝Go會自動配置好GOROOT,路徑為/usr/local/go。Win中默認的GOROOT是在 C:\Go中,也可自己指定

【如下圖所示則我的GORROT為:D:\development\go】,以下是GOROOT目錄的內容:

 

可以看到GOROOT下有bin,doc和src目錄。bin目錄下有我們熟悉的go和gofmt工具。可以認為GOOROOT和Java里的JDK目錄類似。

GOPATH
GOPATH是開發時的工作目錄。用於:

保存編譯后的二進制文件。
go get和go install命令會下載go代碼到GOPATH。
import包時的搜索路徑
使用GOPATH時,GO會在以下目錄中搜索包:

GOROOT/src:該目錄保存了Go標准庫代碼。
GOPATH/src:該目錄保存了應用自身的代碼和第三方依賴的代碼。
假設程序中引入了如下的包:

import "Go-Player/src/chapter17/models"
第一步:Go會先去GOROOT的scr目錄中查找,很顯然它不是標准庫的包,沒找到。
第二步:繼續在GOPATH的src目錄去找,准確說是GOPATH/src/Go-Player/src/chapter17/models這個目錄。如果該目錄不存在,會報錯找不到package。在使用GOPATH管理項目時,需要按照GO尋找package的規范來合理地保存和組織Go代碼。

3、HelloWord——GOPATH版
(1)設置並查看GOPATH和GOROOT環境變量

安裝go SKD目錄:D:\development\go
go項目存放目錄:D:\development\jetbrains\goland\workspace,並且此目錄下含有bin、src、pkg三個文件夾,src文件夾用來存放項目代碼
當引入module時,首先在GOROOT的src目錄下查找,然后再GPOPATH的src目錄下查找

 

(2)GOLand環境配置

在D:\development\jetbrains\goland\workspace\src目錄下新建項目GO-Player
bin:存放編譯后的exe文件

pkg:存放自定義包的目錄

src:存放項目源文件的目錄

 

按如下指令進行配置


可在Settings中選擇SDK和添加GOPATH


(3)測試

models:Student.go


main:hello.go
package main

import (
//"./models" //相對路徑
"Go-Player/src/ademo/models" //根據GOPATH找
//根據GOPATH:D:\development\jetbrains\goland\workspace,在其src目錄下查找
//即GOPATH/src/Go-Player/src/ademo/models
"fmt"
)

func main() {
stu := models.Student{
Name: "張三",
}
fmt.Println(stu)
}
此篇文章僅介紹網上大部分GOPATH版本。Go語言Hello World都只簡單地介紹了GOPATH版本。但是從Go的1.11版本之后,已不再推薦使用GOPATH來構建應用了。也就是說GOPATH被認為是廢棄的,錯誤的做法。

4、一些踩坑經驗
當你開啟了GO111MODULE,仍然使用GOPATH模式的方法,在引入自定義模塊時會報錯。go mod具體使用將在下一篇介紹

GO111MODULE 有三個值:off, on和auto(默認值)。

GO111MODULE=off,go命令行將不會支持module功能,尋找依賴包的方式將會沿用舊版本那種通過vendor目錄或者GOPATH模式來查找。
GO111MODULE=on,go命令行會使用modules,而一點也不會去GOPATH目錄下查找。
GO111MODULE=auto,默認值,go命令行將會根據當前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形:
當前目錄在GOPATH/src之外且該目錄包含go.mod文件
當前文件在包含go.mod文件的目錄下面。
當modules 功能啟用時,依賴包的存放位置變更為$GOPATH/pkg,允許同一個package多個版本並存,且多個項目可以共享緩存的 module。

(1)使用了了相對路徑:import "./models"

報錯:build command-line-arguments: cannot find module for path _/D_/dev這里后面一堆本地路徑
這是因為在go module下 你源碼中 impot …/ 這樣的引入形式不支持了, 應該改成 impot 模塊名/ 。 這樣就ok了

(2)使用結合了GOPATH的形式:import "Go-Player/src/ademo/models"

於是我們把上面的import改成了結合GOPATH的如上形式

報錯:package Go-Player/src/ademo/models is not in GOROOT D:/development/go/src/GPlayer/src/ademo/models
(3)徹底解決方法:用go env -u 恢復初始設置

不再使用go mod:

​​​​​​go env -w GO111MODULE=off 或者 go env -w GO111MODULE=auto
​​​​​​go env -u GO111MODULE
區別在於,如果GO111MODULE=on或者auto,在go get下載包時候,會下載到GOPATH/pkg/mod,引入時也是同樣的從這個目錄開始。如果這行了上述命令,那么在go get下載包時候,會下載到GOPATH/src 目錄下

本文僅介紹Hello world(GOPATH版),雖然此種方法不推薦使用,但是初學者在使用的時候仍會遇到很多問題。后續將介紹如何使用Go Module版

 

參考博客:

Go語言Hello world(GOPATH和Go Module版):https://www.jianshu.com/p/2e19ba8ade18
一次報錯的 徹底明白 go的GOROOT ,GOPATH 以及go mod:https://blog.csdn.net/sinat_23156865/article/details/100655475
————————————————
版權聲明:本文為CSDN博主「知更鳥女孩」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38151401/article/details/105729884


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM